Neo4J v2.0.3。 Cypher:路径请求返回“未知错误”

时间:2014-05-21 12:23:08

标签: neo4j cypher

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 ;

2 个答案:

答案 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的单个步骤。

如果你知道节点nm,你也可以在两者之间使用shortestPath这样的函数。

MATCH p = shortestPath(n:Label {id: 'x2116500'})-[*]-(m:Label {id:'x3116600'}) 
RETURN nodes(p) as nodes;