我有一个如下图所示的示例图。
User
Attribute
Object
节点(a)与(d)和(e)有关系
我想检查哪个Object
节点(h)和(i)与用户所连接的所有Attribute
节点有关系,即(d)和(e)。
所以
我如何在Cypher查询中检测到这一点?
我从以下开始:
MATCH p1 = (u:User)-->(ua:Attribute)-->(oa:Attribute)
WITH *
MATCH p2 = (oa)<-[*]-(o:Object)
RETURN p1,p2
这给了我完整的图表。但是我如何改进这个以获得(h)而不是(i)。
我想我必须从第一部分建立一个结果列表,并验证所有这些是否存在关系?
您可以使用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