2016-06-25 85 views
0

我很努力地找到一种方法来查找两个节点之间的所有路径(到最大长度),同时通过对将要成为关联对象的Neo4j进行排序来控制路径探索探索(由他们的一个属性)。Neo4j Cypher查找探索排序关系的所有路径

所以要清楚,可以说我想找到两个节点K之间的最佳路径,直到最大长度M.查询会像:

match (source{name:"source"}), (target{name:"target"}), 
p = (source)-[*..M]->(target) 
return p order by length(p) limit K; 

到目前为止好。但让我们说路径的关系有一个叫做“优先级”的属性。我想要的是编写一个查询,告诉Neo4j路径探索的每一步,首先应该探索哪些关系。

我知道,当我使用java库和嵌入式数据库(通过实现PathExpander接口并将它作为Java中的GraphAlgoFactory.allSimplePaths()函数的输入)可能)。 但现在我试图找到一种方法,在使用Bolt或REST API的服务器模式数据库访问中执行此操作。

有没有办法在服务器模式下做到这一点?或者在服务器模式下访问图形时可能使用Java库函数?

+0

怎么样'APOC'? https://github.com/neo4j-contrib/neo4j-apoc-procedures#graph-algorithms-work-in-progress –

+0

我检查了它,它不会做我想要的,但无论如何感谢! –

回答

1
  1. 使用标签和索引来查找你的两个启动节点
  2. 也许考虑allShortestPaths,使其更快

试试这个:

match (source{name:"source"}), (target{name:"target"}), 
p = (source)-[rels:*..20]->(target) 
return p, reduce(prio=0, r IN rels | prio + r.priority) as priority 
order by priority ASC, length(p) 
limit 100; 
+0

恐怕这并不是我想要的,事实上,通过对关系进行排序,我希望能够直接遍历目标,从而提高性能。这不是这个查询所做的。 事实上,我想要的是在具有良好性能的大图中找到最佳K路径(不一定是最短路径),但是当我在问题中运行查询时,我会等待很长时间。 –

相关问题