2016-06-25 82 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路徑(不一定是最短路徑),但是當我在問題中運行查詢時,我會等待很長時間。 –

相關問題