Neo4J:交集和谓词

Gre*_*LPU 2 acl intersection neo4j predicates cypher

我正在做一个涉及Neo4J Db的项目,我正面临一个我自己无法解决的问题.

我们正在图中处理Acl.每个Acl都链接到一组元数据.项目也链接到这些元数据.当链接到项目的所有元数据也链接到元数据时,元数据授予对一个项目的访问权限.

这是图模型的图片: ACL图片图片

在此示例中,ACL1授予对item1(但不是item2)的访问权限,并且acl2授予对item2(但不是item1)的访问权限.

我认为诀窍是将节点上的ALL谓词链接到一个项目,但我的尝试总是返回图形中的所有项目(因为它们共享一个元素)

有人可以帮我创建密码查询,以便为一个用户返回他可以访问的所有项目吗?

谢谢你的帮助,格雷戈里

PS:这是一个Neo4j控制台示例数据集:http://console.neo4j.org/r/urjh64

Ste*_*ter 6

ALL这里使用谓词是正确的方法.这个查询怎么样:

MATCH (:User { Login:'User1' })-[:IS_GRANTED]->(acl)-[:IS_APPLICABLE]->(meta)-[:IS_APPLICABLE]->(item)
WITH item, collect(meta) AS userMetas
MATCH (item)<-[:IS_APPLICABLE]-(meta2)
WITH item, userMetas, collect(meta2) AS itemMetas
WHERE ALL (x IN itemMetas   WHERE x IN userMetas)
RETURN item
Run Code Online (Sandbox Code Playgroud)

首先,我们从用户导航到他可能有权访问的所有项目.对于候选人,我们回去收集所有的metas.在WHERE我们确保该项目的所有元素也可供用户使用.