一个简单的查询卡住了

时间:2014-10-28 17:52:20

标签: neo4j cypher graph-databases

我有一个neo4j数据库,它有300万个节点,它们之间有大约9百万个关系。我试图找到两个给定节点之间的最短路径,这两个路径可以双向(关系方向不重要),使用以下查询:

START a=node:CONTACTS(number='3742') , b=node:CONTACTS(number='7423')
MATCH p=a-[r*..5]-b
WITH p, relationships(p) as rcoll
RETURN p, REDUCE(totalTime=0, x in rcoll | totalTime + x.time) as totalTime
ORDER BY totalTime ASC
LIMIT 5;

但此查询卡住了,永远不会返回结果。 知道为什么或如何调试这个?

感谢,

2 个答案:

答案 0 :(得分:2)

您还可以使用路径查找REST-API,您可以在其中提供开始和结束节点,要遍历的关系类型,您可以提供成本变量或计算函数。

请参阅:http://neo4j.com/docs/stable/rest-api-graph-algos.html

示例请求

POST http://localhost:7474/db/data/node/54/path
{
  "to" : "http://localhost:7474/db/data/node/51",
  "cost_property" : "time",
  "relationships" : {
    "type" : "to",
    "direction" : "out"
  },
  "algorithm" : "dijkstra"
}

如果要将其与索引查找相结合,您可能希望使用REST-BATCH-API并将node-url分别替换为{1}和{2}作为批处理ID。

http://neo4j.com/docs/stable/rest-api-batch-ops.html#rest-api-refer-to-items-created-earlier-in-the-same-batch-job

答案 1 :(得分:1)

对于相对较大的数据集中的加权最短路径,您确实需要在Java中使用graphalgo包,并构建非托管扩展(如果您使用的是Neo4j服务器)。 Cypher的reduce并未针对此类查询进行优化。加权最短路径最终可能在Cypher中具有语法。

这应该让你开始: http://neo4j.com/docs/stable/tutorials-java-embedded-graph-algo.html