Neo4j:Cypher匹配节点有属性或有关系

时间:2014-09-19 19:20:11

标签: neo4j cypher

我觉得我在这里忽略了一些显而易见的东西,但只是为了确定。从这个查询开始:

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子句中使用关系标识符,因此理论上我会随着时间的推移而受到性能影响。

1 个答案:

答案 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很重要,那么您可以随时单独清除碰巧满足这两个条件的节点,或以其他方式修复链接,以便两个条件不会同时保留。