Neo4j Cypher查询以查找特定关系的跃点深度长度

Neo4j Cypher查询以查找特定关系的跃点深度长度,neo4j,cypher,Neo4j,Cypher,我试图找到最初源于父节点的关系的数量,但我不确定访问此返回整数所使用的语法。我确信在我的代码中,每个子节点只能有一个特定类型的关系,因此这允许我捕获“真实”的深度读数 我的尝试是这样的,但我希望有一个更干净的方法: MATCH p=(n {id:'123'})-[r:Foo*]->(c) RETURN length(p) 我不确定这是正确的语法,因为它返回一个整数数组,最后一个索引是真正的计数长度。我希望它能返回一个int而不是前面提到的数组 非常感谢您提供的帮助。您的问题: MATCH

我试图找到最初源于父节点的关系的数量,但我不确定访问此返回整数所使用的语法。我确信在我的代码中,每个子节点只能有一个特定类型的关系,因此这允许我捕获“真实”的深度读数

我的尝试是这样的,但我希望有一个更干净的方法:

MATCH p=(n {id:'123'})-[r:Foo*]->(c)
RETURN length(p)
我不确定这是正确的语法,因为它返回一个整数数组,最后一个索引是真正的计数长度。我希望它能返回一个int而不是前面提到的数组

非常感谢您提供的帮助。

您的问题:

MATCH p=(n {id:'123'})-[r:Foo*]->(c)
RETURN length(p)
正在返回从
n
c
所有可能路径的长度。你可能只对最短路径感兴趣?您可以使用<代码> StestPrase函数,只考虑从<代码> N< /代码>到<代码> c>代码>的最短路径:

MATCH p = shortestPath((n {id:'123'})-[r:Foo*]->(c))
RETURN length(p)
您的查询:

MATCH p=(n {id:'123'})-[r:Foo*]->(c)
RETURN length(p)
正在返回从
n
c
所有可能路径的长度。你可能只对最短路径感兴趣?您可以使用<代码> StestPrase函数,只考虑从<代码> N< /代码>到<代码> c>代码>的最短路径:

MATCH p = shortestPath((n {id:'123'})-[r:Foo*]->(c))
RETURN length(p)

正如Nicole所说,一般来说,在任何合理的时间内都不可能找到图中两个节点之间的最长路径。如果图形非常小,则有可能找到所有路径,并选择具有最多边的路径,但这无法缩放到较大的图形

然而,在某些情况下,有一个技巧是可以做到的如果图形不包含有向循环,则可以为每条边指定-1的权重,然后查找源节点和目标节点之间的最短加权路径。由于边权重为负,因此最短加权路径必须对应于在所需节点之间具有最大边数的路径

不幸的是,Cypher还不支持最短加权路径算法,但Neo4j数据库引擎支持。这些文件给出了一个如何做到这一点的例子。您还需要实现自己的算法,例如Bellman Ford使用traversal API,因为Dijkstra不能使用-ve边权重


但是,请注意,如果图形包含循环,此技巧将不起作用-它必须是一个循环。

正如Nicole所说,一般来说,在任何合理的时间内都不可能找到图形中两个节点之间的最长路径。如果图形非常小,则有可能找到所有路径,并选择具有最多边的路径,但这无法缩放到较大的图形

然而,在某些情况下,有一个技巧是可以做到的如果图形不包含有向循环,则可以为每条边指定-1的权重,然后查找源节点和目标节点之间的最短加权路径。由于边权重为负,因此最短加权路径必须对应于在所需节点之间具有最大边数的路径

不幸的是,Cypher还不支持最短加权路径算法,但Neo4j数据库引擎支持。这些文件给出了一个如何做到这一点的例子。您还需要实现自己的算法,例如Bellman Ford使用traversal API,因为Dijkstra不能使用-ve边权重


但是,请注意,如果您的图形包含循环,此技巧将不起作用-它必须是a。

您是在尝试查找最大深度还是仅查找传出
:Foo
关系的数量?尝试查找最大深度,然后将其包装在
MAX
中<代码>返回最大值(长度(p))。但是,您的查询非常昂贵,并且很可能无法在足够大的图形上完成。您是在尝试查找最大深度还是仅查找传出的
:Foo
关系数?尝试查找最大深度,然后将其包装在
MAX
中<代码>返回最大值(长度(p))。但是,您的查询非常昂贵,而且很可能无法在足够大的图形上完成。