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 ;发布于 2014-05-21 16:53:29
[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属性创建索引。
发布于 2014-05-21 21:45:24
您的第一个查询可能会产生数百万条路径。这需要一段时间来计算。60年代以后浏览器就会超时。
首先,您应该使用一个标签,并在: 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;https://stackoverflow.com/questions/23783054
复制相似问题