所以我有这个图形结构,其中许多“顶层”和子空间可以像这样存在:
我有下一个密码查询:
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 没问题,因为他只是路径中一个空间的成员
此外,例如,如果 SIMON DDD 是“LEVEL 1 SPACE A”的成员,则查询也可以正常工作,因为查询中的“NOT”子句将起作用,这意味着如果用户是“LEVEL 1 SPACE A”中每个空间的成员,路径仅显示顶层空间
此查询将获取
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