Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 匹配长度可变的分支路径_Neo4j_Cypher - Fatal编程技术网

Neo4j 匹配长度可变的分支路径

Neo4j 匹配长度可变的分支路径,neo4j,cypher,Neo4j,Cypher,我有一个图表,看起来像这样: 以下是neo4j控制台中图形的链接: 基本上,有两条长度可变的分支路径。我想匹配橙色节点和黄色节点之间的两条路径。我想为每个路径返回一行数据,包括所有遍历的节点。我还希望能够在不同的中间节点上包含不同的WHERE子句 最后,我需要一个数据表,如下所示: a-b-c-d neo-morpheus-null-leo 新莫菲斯-三位一体-塞弗 我怎么能这么做? 我尝试使用可选匹配,但无法分别获得这两行 我尝试使用可变长度路径,它返回两条路径,但不允许访问和筛选中间

我有一个图表,看起来像这样:

以下是neo4j控制台中图形的链接:

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

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

  • a-b-c-d
  • neo-morpheus-null-leo
  • 新莫菲斯-三位一体-塞弗
我怎么能这么做? 我尝试使用可选匹配,但无法分别获得这两行

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

我看到了这个问题:


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

您可以使用
WHERE
语句定义您的最终节点。因此,在您的情况下,结束节点没有传出关系。不知道为什么你会像你说的那样期望返回空值
neo-morpheus-null-leo

MATCH p=(n:Person{name:"Neo"})-[*]->(end) where not (end)-->()
RETURN extract(x IN nodes(p) | x.name)
编辑:

这可能不是最好的选择,因为我不知道如何通过编程实现。如果我使用
展开
我只返回一行。这是一个虚拟的解决方案

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

您可以使用Cypher来匹配这样的路径
匹配p=(:a)-[*]->(:d)返回p
,p将是路径中按遍历顺序排列的节点/关系列表。您可以像使用节点匹配一样在何处应用过滤路径,并对其应用所需的任何列表函数

我也将添加这些示例

// 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”?在上一个示例中,我将每个列设置为标签的节点集。

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

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

    希望这有帮助

    问候,, 汤姆


    另外,这似乎是一个很容易的选择,但看看你的查询与回答你的逻辑所需的结构相比有多简单。所以分离关注点

    我尝试使用path,但我想对路径中的不同中间节点应用单独的过滤器。我还需要在末尾有数据行,而不是列表。我正在更新我的问题,使之更清楚。@FlorentChatterji我添加了更多使用路径的示例。我不确定你想用什么逻辑。最后一个例子与您的要求最接近。如果您需要动态生成的列,那么您可能需要选择一个包含节点列表的列。有办法吗?