【问题标题】:Cypher query to limit search to specific subgraph密码查询将搜索限制在特定子图
【发布时间】:2017-05-09 08:02:28
【问题描述】:

我有一个 Neo4j 数据库,其中包含许多断开连接的子图(按设计)。每个子图都有一个“组织”节点,因为它是根/起始节点。目的是让每个组织只能查询自己的子图。

我在图表前面有一个 webapp,它提供了用户所属组织的 ID。组织的所有节点都与组织节点有关系。

如果您知道根/起始节点,对特定子图强制执行查询的最佳方法是什么?

我一直在玩这个例子,它有效,但我想知道是否有更好的方法:

MATCH (org:Organization {org_id: 1}) WITH org
MATCH p=(user:User)-[:SITTING_IN]->(room:Room)
WITH p, user, room
WHERE (user)-[:MEMBER_OF]->(org) AND (room)-[:MEMBER_OF]->(org)
RETURN p

当节点的数量随着更复杂的查询而增长时,这很快就会变得很麻烦,你必须记住在 WHERE 子句中检查它们。

【问题讨论】:

标签: neo4j cypher


【解决方案1】:

如果所有组织图都是互斥的(无法通过遍历从一个到另一个),那么您只需检查未通过遍历找到的节点(在本例中为“用户”,但用户可以是通过 org 的遍历找到。因此,如果您从 org 开始,并从那里找到所有内容作为遍历,则无法输入任何其他图表)。对应该始终正确的内容进行额外检查只会在 Cypher 上进行更多工作以进行毫无意义的验证。

由于每个图都是互斥的,所以遍历方向无关紧要。

【讨论】:

  • 是的,这是有道理的。所以是这样的:(?)MATCH (org:Organization {org_id: 1}) WITH orgMATCH p=(org)<-[:MEMBER_OF]-(user:User)-[:SITTING_IN]->(room:Room) RETURN p
  • @devnullagain 是的。只要您匹配 Org 节点,并且您匹配的所有其他内容在查询中都有某种形式的关系链链接回 org,那么匹配的所有内容都将用于该 org(并且通过将 org/org.id 作为列返回,您可以匹配多个组织,组织列会告诉您在哪个组织中找到匹配项。)
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多