在Neo4j中到达第一个所需节点时停止遍历

时间:2015-04-23 19:25:50

标签: neo4j cypher

很抱歉,如果问题看起来很模糊:)我正在寻找的查询有点具体。考虑图中的以下分支:

(a:Detector {prop_x:False}) - >(b:Category {prop_x:False}) - >(c:Category {prop_x:True}) - >(d:Category { prop_x:True}) - >(...)等等

现在我希望得到a的所有父节点,直到我到达一个节点的属性prop_x为True然后停止的节点。即我想要路径:

(a:探测器{prop_x:False}) - >(b:类别{prop_x:False}) - >(c:类别{prop_x:True})

我尝试了以下查询:

match path=(child:Detector)-[*]->(parent:Category {prop_x:True}) return path

但我获得的路径还包括节点(d:Category),因为它也有prop_x True。

我希望图表中的所有此类路径都以 Detector 节点开头,直到第一个“父” Category 节点< / strong> prop_x

1 个答案:

答案 0 :(得分:1)

您在那里的表达式将匹配以标签为Label的节点开头的所有路径,并以标签为Labelprop_xtrue的节点结束}。我假设你知道你要从哪里开始,并开始使用name A的节点。然后将那里的所有路径与prop_x true的{​​{1}}进行匹配。这可能包括true - false - true的路径。我按照路径长度对结果路径进行了排序,并仅保留了最高匹配。

match path=(child:Node {name: 'A'})-[*]->(parent:Node {prop_x:True})
return length(path), nodes(path)
order by length(path)
limit 1

NEW NEW

每个更新的问题更新,“如何从所有Detector Nodes找到所有此类路径?”

我想了一会儿,这就是我想出来的......

// first match all of your detector nodes
match (d:Detector)
with d
// then for each detector node match the paths that end with True
match path=d-[*]->(parent:Category {prop_x:True})
// for each detector collect the length and matching nodes
with d, [ length(path), nodes(path) ] as path_match
// order by the detector name and path length so they are grouped and sorted
order by d.name, length(path)
// then collect all of the length, path collections so there is one
// row per detector
with d, collect(path_match) as path_matches
// then return the first Detector and the first (i.e. shortest) collection in the collection of paths
return d.name, path_matches[0]