我试图找到最初来自父节点的关系数量,我不确定要使用的语法以获得对此返回的整数的访问权限。我可以肯定在我的代码中,每个子节点只能有一个特定类型的关系,这样我就可以捕获一个" true"深度阅读
我的尝试是这样的,但我希望有一种更清洁的方式:
MATCH p=(n {id:'123'})-[r:Foo*]->(c)
RETURN length(p)
我不确定这是正确的语法,因为它返回一个整数数组,最后一个索引是真正的计数长度。我希望能够返回一个int而不是这个提到的数组。
我非常感谢你能提供的帮助。
答案 0 :(得分:4)
正如Nicole所说,一般来说,在图表中找到两个节点之间的最长路径在任何合理的时间内都是不可行的。如果您的图表非常小,您可能会找到所有路径,并选择边缘最多的路径但不会缩放到较大的图形。
但是在某些情况下你可以做一些技巧。 如果图表不包含有向循环,则可以为每个边分配权重-1,然后在源节点和目标节点之间查找最短加权路径。由于边缘权重是负的,因此最短加权路径必须对应于在期望节点之间具有最大边数的路径。
不幸的是,Cypher还不支持最短加权路径算法,但是Neo4j数据库引擎却支持。文档提供了如何执行此操作的示例。您还需要使用遍历API实现自己的算法,例如Bellman-Ford,因为Dijkstra不能使用-ve edge权重。
但是,请注意,如果您的图表包含周期,则此技巧不会起作用 - 必须为DAG。
答案 1 :(得分:1)
您的查询:
MATCH p=(n {id:'123'})-[r:Foo*]->(c)
RETURN length(p)
将所有可能路径的长度从n
返回到c
。你可能只对最短的路径感兴趣?您可以使用shortestPath
功能仅考虑从n
到c
的最短路径:
MATCH p = shortestPath((n {id:'123'})-[r:Foo*]->(c))
RETURN length(p)