Neo4j 匹配长度可变的分支路径
我有一个图表,看起来像这样: 以下是neo4j控制台中图形的链接: 基本上,有两条长度可变的分支路径。我想匹配橙色节点和黄色节点之间的两条路径。我想为每个路径返回一行数据,包括所有遍历的节点。我还希望能够在不同的中间节点上包含不同的WHERE子句 最后,我需要一个数据表,如下所示:Neo4j 匹配长度可变的分支路径,neo4j,cypher,Neo4j,Cypher,我有一个图表,看起来像这样: 以下是neo4j控制台中图形的链接: 基本上,有两条长度可变的分支路径。我想匹配橙色节点和黄色节点之间的两条路径。我想为每个路径返回一行数据,包括所有遍历的节点。我还希望能够在不同的中间节点上包含不同的WHERE子句 最后,我需要一个数据表,如下所示: a-b-c-d neo-morpheus-null-leo 新莫菲斯-三位一体-塞弗 我怎么能这么做? 我尝试使用可选匹配,但无法分别获得这两行 我尝试使用可变长度路径,它返回两条路径,但不允许访问和筛选中间
- 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开始的所有路径)。我这样说是因为:
另外,这似乎是一个很容易的选择,但看看你的查询与回答你的逻辑所需的结构相比有多简单。所以分离关注点我尝试使用path,但我想对路径中的不同中间节点应用单独的过滤器。我还需要在末尾有数据行,而不是列表。我正在更新我的问题,使之更清楚。@FlorentChatterji我添加了更多使用路径的示例。我不确定你想用什么逻辑。最后一个例子与您的要求最接近。如果您需要动态生成的列,那么您可能需要选择一个包含节点列表的列。有办法吗?