Neo4j:检查路径中所有连续关系之间的条件
Neo4j: Check condition between all consecutive relations in path
我要查询任意长度的所有路径
(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
现在,这似乎奏效了。但是,我不确定这是否是最有效的查询。有更好的方法吗?
你实际上可以做到这一点,通过在路径的关系集合的大小上使用 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
属性 是你们关系的时间戳 属性
这里的工作示例:
我要查询任意长度的所有路径
(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
现在,这似乎奏效了。但是,我不确定这是否是最有效的查询。有更好的方法吗?
你实际上可以做到这一点,通过在路径的关系集合的大小上使用 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
属性 是你们关系的时间戳 属性
这里的工作示例: