NEO4J 查询子句位于类似成员关系图的树中

问题描述 投票:0回答:1

所以我有这个图形结构,其中许多“顶层”和子空间可以像这样存在:

我有下一个密码查询:

MATCH (user:User {auth_token: $auth_token}) 
      MATCH (space:Space)
      WHERE (
        (NOT (space)<-[:PARENT_OF]-(:Space) AND (user)-[:MEMBER_OF]->(space) AND space.pod_state IN ['active', 'pending'] AND space.pod_type IN ['standard', 'readonly'])
        OR
        (EXISTS {MATCH (parent:Space)-[:PARENT_OF*]->(space)<-[:MEMBER_OF]-(user) WHERE NOT (user)-[:MEMBER_OF]->(parent) AND space.pod_state IN ['active', 'pending'] AND space.pod_type IN ['standard', 'readonly']})
      )
      RETURN space

在这种情况下我需要的是用户可以看到的空格列表(蓝色)(黄色) 所以:

  • Simon DDD 应该只看到“TOP LEVEL SPACE”,即使他也是“LEVEL 2 SPACE”的成员,他也应该看到每个层次结构中最高级别的空间。
  • Simon LALALA 另一方面应该看到“2 级空间”,因为他只是该空间的成员。

在提供的查询中,SIMON DDD 同时获取“TOP LEVEL SPACE”和“LEVEL 2 SPACE” SIMON LALALA 没问题,因为他只是路径中一个空间的成员

此外,例如,如果 SIMON DDD 是“LEVEL 1 SPACE A”的成员,则查询也可以正常工作,因为查询中的“NOT”子句将起作用,这意味着如果用户是“LEVEL 1 SPACE A”中每个空间的成员,路径仅显示顶层空间

neo4j cypher
1个回答
0
投票

此查询将获取

User
所属的顶级(“可见”)空间:

MATCH (user:User {auth_token: $auth_token})-[:MEMBER_OF]->(space)
WITH user, COLLECT(space) AS spaces
RETURN user, REDUCE(x = [], s IN spaces |
  CASE WHEN NONE(a IN [(s)<-[:PARENT_OF*]-(ancestor)|ancestor] WHERE a IN spaces)
  THEN x + s
  ELSE s END
) AS visibleSpaces
© www.soinside.com 2019 - 2024. All rights reserved.