我有一个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;
但此查询卡住了,永远不会返回结果。 知道为什么或如何调试这个?
感谢,
答案 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。
答案 1 :(得分:1)
对于相对较大的数据集中的加权最短路径,您确实需要在Java中使用graphalgo包,并构建非托管扩展(如果您使用的是Neo4j服务器)。 Cypher的reduce并未针对此类查询进行优化。加权最短路径最终可能在Cypher中具有语法。
这应该让你开始: http://neo4j.com/docs/stable/tutorials-java-embedded-graph-algo.html