Neo4j:检查路径中所有连续关系之间的条件

时间:2016-09-12 15:38:22

标签: neo4j cypher sliding-window

我想查询任意长度的所有路径

(a)-[:Relation*]->(b)

每对(r1, r2)连续关系的位置

()-[r1]->()-[r2]->()

符合r2.foo > r1.foo的条件。

您可以将foo想象成一个时间戳,我只想找到所有步骤按时间顺序排列的路径。

我现在拥有的是:

MATCH path = ()-[:Relationship*]->()
WITH rels(path) AS rels, path
WHERE reduce(acc = { inOrder: true, previous: rels[0] }, r IN tail(rels) |
    { inOrder: acc.inOrder AND r.foo > acc.previous.foo, previous: r }).inOrder
RETURN path

现在,这似乎有效。但是,我不确定这是否是最有效的查询。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:5)

你可以通过播放路径关系集合大小的ALL谓词来实际执行此操作,例如:

MATCH p=(a:Cool)-[*]->(c) 
WHERE ALL ( x IN range(1, length(p)-1) WHERE (rels(p)[x]).i > (rels(p)[x-1]).i ) 
AND length(p) > 1
RETURN p

我的查询中的i属性将是您关系的时间戳属性

这里的工作示例:

http://console.neo4j.org/r/2bzo4m