Neo4j v2.0.3。
在使用命令:
尝试获取节点路径时,有大约30000个节点的图形MATCH p = (n {id: 'x2116500'})-[*]-(m) RETURN nodes(p) as nodes;
Cypher Web应用程序返回"未知错误"。在具有15个节点的数据库上,此请求按预期工作!
然而请求:
MATCH p = (n {id: 'x2116500'})-[r]-(m) RETURN nodes(p) as nodes
返回一些节点,但不是路径中的所有节点。类似的从路径获取关系的请求也会发生同样的错误,这个失败了:
MATCH p = (n {id: 'x2116500'})-[*]-(m) RETURN relationships(p) as rels ;
这会返回一些关系,但不是路径中的所有关系:
MATCH p = (n {id: 'x2116500'})-[r]-(m) RETURN relationships(p) as rels ;
答案 0 :(得分:1)
[r]
语法(没有星号)表示您只希望在每个匹配的路径中只有一个关系,因此使用[r]
的2个备用查询应不返回所有关系(在多关系路径中)。因此,这两个查询正在按预期工作。
对于[*]
的查询,请确保路径中没有循环。以下是循环路径的示例:
(a)-[r1]->(b)-[r2]->(c)-[r3]->(d)-[r4]->(c)
上述路径有3种非循环关系。如果您不希望任何非循环路径具有超过4个关系,则可以使用以下查询来获取该路径中的不同节点,即使可以循环:
MATCH p = ({id: 'x2116500'})-[r*1..4]-()
RETURN DISTINCT nodes(p) as nodes;
此查询也更有可能完成(而不是永远运行或内存不足)。
此外,为了使此查询更快,您应该标记起始节点并使用该标签和id
属性创建索引。
答案 1 :(得分:0)
您的第一个查询可能会产生数百万条路径。需要一段时间来计算。浏览器目前在60年代后超时。
首先,您应该使用Label并对其进行索引或约束:Label(id)
尝试将最大步数或最大路径限制为合理的值。
//max steps
MATCH p = (n:Label {id: 'x2116500'})-[*..5]-(m) RETURN nodes(p) as nodes;
//max-paths
MATCH p = (n:Label {id: 'x2116500'})-[*]-(m) RETURN nodes(p) as nodes limit 1000;
关系相同。
请注意,此查询只是从节点n到m的单个步骤。
如果你知道节点n
和m
,你也可以在两者之间使用shortestPath
这样的函数。
MATCH p = shortestPath(n:Label {id: 'x2116500'})-[*]-(m:Label {id:'x3116600'})
RETURN nodes(p) as nodes;