Cypher确定共享节点是否存在路径

时间:2018-01-04 10:10:40

标签: neo4j cypher

我有一个示例图,如下所示。

enter image description here 节点具有以下标签:

  • 节点(a)具有标签User
  • 节点(b)直到(g)具有标签Attribute
  • 节点(h)和(i)具有标签Object

节点(a)与(d)和(e)

有关系

我想检查哪个Object节点(h)和(i)与所有用户所连接的Attribute节点的关系,即(d)和(e)。

所以

  • 节点(h)与(d)AND与(e)的关系 - >这没关系
  • 节点(i)仅与(e) - >有关系。这不行

如何在Cypher查询中检测到这一点?

我开始使用类似的东西:

MATCH p1 = (u:User)-->(ua:Attribute)-->(oa:Attribute)
WITH *
MATCH p2 = (oa)<-[*]-(o:Object)
RETURN p1,p2

这给了我完整的图表。但是我如何改进这个以仅得到(h)而不是(i)。

我想我必须从第一部分建立一个结果列表,并验证所有这些结果是否存在?

1 个答案:

答案 0 :(得分:2)

您可以使用ALL谓词

进行检查
// First retrieve the Attribute nodes the User is connected to and make it a collection
MATCH (u:User)-[:ASSOCIATED_TO]->(attribute)
WITH u, collect(attribute) AS attributes
// Find the objects having relationships to ALL elements in attributes
MATCH (o:Object) WHERE 
ALL( x IN attributes WHERE (o)--(x) )
RETURN u, attributes, collect(o) AS objects