Neo4j Cypher:在链表中找到第一个匹配关系?

Ase*_*ore 5 neo4j cypher

就像问题说的那样。“第一”一词很重要-可能有更多符合相同条件的关系。

实际的用例:每个关系都有一个timestamp属性,我想找到在某个时间之前(例如“中午之前”)发生的第一个关系。例如:

(head) -[time: 9]-> () -[time: 8]-> () -[time: 7]-> ...
Run Code Online (Sandbox Code Playgroud)

-

这就是我所拥有的(假设我们知道head节点是什么):

MATCH (head) -[prevs:next*0..]-> (x) -[rel:next]-> (y)
WHERE NONE(prev IN prevs WHERE prev.time < {time})
AND rel.time < {time}
RETURN x, rel, y
Run Code Online (Sandbox Code Playgroud)

就是说,“遍历一个或多个关系,直到我们找到一个之前{time}的关系,并且之前的关系都不是之前的{time}。”

该查询有效,但令人惊讶的是,即使找到一个匹配项它仍继续遍历该列表。更准确地说,它会不断扩展可变长度匹配-即使其他NONE()检查显然会失败。

也许这只是尚未进行的Cypher优化?同时,是否有更有效的方法可以查询此信息?(爱荷华州,有什么办法可以在第一次比赛后实现“短路”吗?)

-

这是一个控制台链接,可用于:

http://console.neo4j.org/r/b4v2tl

重要说明:该安装程序将创建一个1001节点链接列表,因此它可能会冻结您的浏览器/选项卡一分钟左右。我建议解冻时立即禁用“ Toggle Viz”。

为了简单起见,该控制台示例还颠倒了上面示例中的时间顺序。因此,将此查询粘贴到:

MATCH (head:Node {id: 0}) -[prevs:next*0..]-> (x) -[rel:next]-> (y)
WHERE NONE(prev IN prevs WHERE prev.time > 5)
AND rel.time > 5
RETURN x, rel, y
Run Code Online (Sandbox Code Playgroud)

这就是在查询列表中的第五个关系。

您会看到Neo4j拒绝执行查询。如果更改0..0..10,则可以使用。不断加速10,您会发现它越来越慢。守卫踢过来100

Sum*_*rma 0

尝试这个:

MATCH (x)-[r:next]->(y) 
WHERE r.time > {time} 
RETURN x, r, y
ORDER BY r.time
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

编辑

如果您的关系按时间属性编入索引,那么

START r=relationship:rels(time = {time})
MATCH (x)-[r1:next]->(y)-[r]->()
RETURN x,r1,y
Run Code Online (Sandbox Code Playgroud)