作为一种验证测试,我想为每个带有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
,它只会计算总数,而不是该节点的数量...
答案 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