匹配可变长度

时间:2017-07-25 18:05:44

标签: neo4j cypher

我的图表看起来像这样:

enter image description here

以下是neo4j控制台中图表的链接: http://console.neo4j.org/?id=av3001

基本上,您有两条可变长度的分支路径。我想匹配橙色节点和黄色节点之间的两条路径。我想为每个路径返回一行数据,包括所有遍历的节点。我还希望能够在不同的中间节点上包含不同的WHERE子句。

最后,我需要有一个数据表,如下所示:

  • a - b - c - d
  • neo - morpheus - null - leo
  • neo - morpheus - trinity - cypher

我怎么能这样做? 我尝试过使用OPTIONAL MATCH,但是我无法分别获得这两行。

我尝试使用可变长度路径,它返回两条路径,但不允许我访问和过滤中间节点。另外,它返回一个列表,而不是数据表。

我已经看到了这个问题: Cypher - matching two different possible paths and return both

它涉及同一主题,但示例非常复杂,这个更简单的问题的更通用的解决方案是我正在寻找的。

3 个答案:

答案 0 :(得分:2)

您可以使用WHERE语句定义结束节点。所以在你的情况下,终端节点没有传出关系。当你说neo - morpheus - null - leo

时,不确定你为什么期望返回null
MATCH p=(n:Person{name:"Neo"})-[*]->(end) where not (end)-->()
RETURN extract(x IN nodes(p) | x.name)

编辑:

可能不是最佳选择,因为我不确定如何以编程方式执行此操作。如果我使用UNWIND,我只会回来一行。所以这是一个虚拟解决方案

MATCH p=(n{name:"Neo"})-[*]->(end) where not (end)-->() 
with nodes(p) as list 
return list[0].name,list[1].name,list[2].name,list[3].name

答案 1 :(得分:1)

您可以使用Cypher匹配此MATCH p=(:a)-[*]->(:d) RETURN p之类的路径,p将是路径中遍历的节点/关系列表。您可以应用WHERE来过滤路径,就像使用节点匹配一样,并应用您需要的任何列表函数。

我也会添加这些例子

// Where on path
MATCH p=(:a)-[*]-(:d) WHERE NONE(n in NODES(p) WHERE n.name="Trinity") WITH NODES(p) as p RETURN p[0], p[1], p[2], p[3]

// Spit path into columns
MATCH p=(:a)-[*]-(:d) WITH NODES(p) as p RETURN p[0], p[1], p[2], p[3]

// Match path, filter on label
MATCH p=(:a)-[*]-(:d) WITH NODES(p) as p RETURN FILTER(n in p WHERE "a" in LABELS(n)) as a, FILTER(n in p WHERE "b" in LABELS(n)) as b, FILTER(n in p WHERE "c" in LABELS(n)) as c, FILTER(n in p WHERE "d" in LABELS(n)) as d

不幸的是,您必须为每列明确设置一些逻辑。你不能制作动态列(我知道)。在您的表示例中,哪个列获取“null”的规则是什么?在最后一个示例中,我将每列设置为标签的节点集。

答案 2 :(得分:0)

I.m.o。你要求对简单查询的结果进行广泛的后处理(给我从Neo开始的所有路径)。我这样说是因为:

  1. 您声明您需要能够为每个路径指定特定的WHERE子句(但是您没有指定哪个路径的哪个子句......表明这可能是一个动态的东西?)
  2. 您事先并不知道最长路径的大小...但您仍希望结果是一个相同大小的所有结果表。那么 null 列是否总是在结束节点之前?为什么(除了方便之外没有真正的意义)?
  3. ...
  4. 因此(以及i.m.o.)您需要以(Java或任何您喜欢的)程序处理结果。在那里,您可以完全控制结果集,并可以根据需要切片和切块。 Cypher(事实上就像SQL一样)只能做很多事情而且看起来你已经超越了它。

    希望这有帮助,

    此致 汤姆

    P.S。这可能看起来很容易选择退出,但看看你的查询是如何简单,而不是试图回答你的逻辑的结构。所以...... 将问题分开