我正在寻找在Neo4j cypher中执行set操作。基本上我与两个方向的一组节点有关系,我想只找到一方与另一方有关系的节点。
给出类似于以下的图表:
/----- b1 -\
/ \
a ------ b2 --c1
\ \/
\ /\
\---- b3 --c2
我只想要c1
返回,因为c2
确实与b1
有a
的直接关系。
答案 0 :(得分:0)
我有一个似乎有效的解决方案,但我不知道它是否是最佳的。
match (a:A)--(b:B)
with a, count(b) as bCount1
match (a)--(b:B)--(c:C)
with c, bCount1, count(b) AS bCount2
where bCount1 = bCount2
return c
答案 1 :(得分:0)
您可以使用标签将节点表示为一组或另一组(假设它们是相互排斥的)。我还假设节点" a"是一个根节点和/或不需要直接连接到" c1"或" c2"。
在上面的ASCII艺术示例中,假设" b1"标签为" Set1"而所有其他人都有" Set2",这样的事情可能有效:
MATCH (n:Set2)--(o:Set1), (allS1:Set1)
WHERE length(collect(o)) = count(allS1)
WITH n, length(collect(o))
RETURN n
......或其变体。同样,这是假设您一次只做这一套。做到这两点不应该花费太多精力。它也可能不是最有效的,但它应该做到这一点。试一试,让我们知道。
HTH,和往常一样,如果有更好的方法可以做到这一点(很可能),让我们看看那些答案!