Cypher:找到每次都采用最大值步长的路径

时间:2014-10-08 18:04:59

标签: neo4j cypher

我正在尝试编写一个cypher查询,该查询在节点a和b之间找到一条路径,这样每个步骤都有一个小于15的所有可用备选方案中的最大时间戳值。

到目前为止,这是我的查询,除了在每一步选择最大可能的时间戳之外,它会执行所有操作。我该如何表达这种情况?

MATCH path=(a:NODE)-[rs:PARENT*]->(b:NODE)
WHERE a.name = 'SOME_VALUE' and b.name = 'SOME_OTHER_VALUE' AND ALL (r IN rs 
  WHERE r.timestamp < 15) 
RETURN path

这只是糟糕的sudo代码,但我认为它表达了我正在寻找的东西

MATCH path=(a:NODE)-[rs:PARENT*]->(b:NODE)
WHERE a.name = 'SOME_VALUE' and b.name = 'SOME_OTHER_VALUE' AND ALL (r IN rs 
  WHERE r.timestamp < 15 AND r.timestamp = max(allPossibleRsForThisStep)) 
RETURN path

这种查询可以用cypher编写吗?

1 个答案:

答案 0 :(得分:0)

在密码中不会很快,可以先计算所有最大值,然后通过将列表中的最大值与当前值进行比较来做你想做的事。

这样的东西(不确定它是否有效)

WITH range(1,10) as max_vals // a list with 10 values (actual values are not that important)
MATCH (a:NODE)-[rs:PARENT*..10]->(b:NODE)
WHERE a.name = 'SOME_VALUE' and b.name = 'SOME_OTHER_VALUE'
WITH a,b, 
      map(idx in range(0,size(rs)) | 
        max_vals[idx] = case when max_vals[idx]<rs[idx].timestamp then rs[idx].timestamp else max_vals[idx] end ), max_vals


MATCH path=(a)-[rs:PARENT*..10]->(b)
 AND ALL (idx in range(0,size(rs)  WHERE rs[idx].timestamp < 15 AND rs[idx].timestamp = max_vals[idx]) 
RETURN path