我觉得我在这里忽略了一些显而易见的东西,但只是为了确定。从这个查询开始:
match (e:Event), (u:User)
where (e.status = 'public' XOR (e)<-[:`can_access`*1..2]-(u) AND u.id = '541c7a8797b272f708000001')
return e
返回所有公共事件或通过“can_access”关系从用户最多可访问两度的事件。它按预期工作。
这是解决此问题的最佳方法吗?我无法在where
子句中使用关系标识符,因此理论上我会随着时间的推移而受到性能影响。
答案 0 :(得分:1)
你这样做的方式看起来不错,但如果你正在寻找其他建议,你可以这样做。主要是将WHERE
的大部分内容移到MATCH
块中,而不是:
MATCH (e:Event {status: "public"})
RETURN e
UNION
MATCH (e:Event)<-[:`can_access`*1..2]-(u:User {id: '541c7a8797b272f708000001'})
RETURN e;
现在,这会忽略您的XOR
位,因此我认为某些内容既可以公开,也可以通过can_access
访问。在这种情况下,您的查询将排除这样的结果,我的将包括它。但基于查询的语义,我猜这是可以的,你真的不需要XOR
。如果XOR
很重要,那么您可以随时单独清除碰巧满足这两个条件的节点,或以其他方式修复链接,以便两个条件不会同时保留。