Neo4j cypher在where子句中设置操作

时间:2014-05-12 16:52:29

标签: neo4j cypher

我正在寻找在Neo4j cypher中执行set操作。基本上我与两个方向的一组节点有关系,我想只找到一方与另一方有关系的节点。

给出类似于以下的图表:

  /----- b1 -\
 /            \
a ------ b2 --c1
 \          \/
  \         /\
   \---- b3 --c2     

我只想要c1返回,因为c2确实与b1a的直接关系。

2 个答案:

答案 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,和往常一样,如果有更好的方法可以做到这一点(很可能),让我们看看那些答案!