Neo4j:计算每个节点带有特定标签的邻居的数量

时间:2020-10-05 10:40:47

标签: neo4j cypher

作为一种验证测试,我想为每个带有labelA的节点计算具有给定labelB的相邻节点的数量,然后为每个不等于2的邻居返回任何labelA。

基本上,parent:parent_name应该始终有2个连接的节点,它们的标签为child_name。如何返回该语句为False的节点?

此刻,我正在非常耗时的“匹配neo4j中的所有内容”,然后进行groupby并使用python Pandas进行计数。

密码:

MATCH (parent: parent_name) 
MATCH (parent)-->(child: child_name)
RETURN parent.id, child.id, 'child_name' as child_label, 'parent_name' as parent_label

熊猫的后处理:

grouped = df.groupby(['child_label', 'child.id']).apply(len)
result = grouped[grouped != 2].index  # returns pairs of child_label and child.id

我无法大规模地做到这一点。查找邻居是图的主要用例之一!一定有办法做到这一点!

也许每个UNDWIND都使用parent_name?如果我在count下使用UNWIND,它只会计算总数,而不是该节点的数量...

2 个答案:

答案 0 :(得分:1)

一种通用的方法可能是沿着这条线,找到标签为:LabelA的任何节点与标签为LabelB的两个邻居(与关系的方向无关)

MATCH (n:LabelA)
WITH n,
     SIZE([(n)--(m:LabelB) | m ])  AS nodeCountLabelB
WHERE nodeCountLabelB <> 2
RETURN n
   

答案 1 :(得分:1)

这是获取具有错误子节点数的每个parent节点的ID以及其现有子ID列表(可能为空)的一种方法:

MATCH (parent:parent_name)
WITH parent.id AS parentId, [(parent)-->(child:child_name) | child.id] AS childIds
WHERE SIZE(childIds) <> 2
RETURN parentId, childIds