2017-06-20 35 views
0

我有一個關於如何根據關係屬性高效地過濾搜索結果的問題。Neo4j Cypher在大型圖上按權重過濾關係


我有這樣的曲線圖:

(:PERSON) - [:WORKED_WITH {重量:30}] - >(:PERSON)

超過300.000節點標記的PERSON和過15.000.000條邊標記爲:WORKED_WITH(每條都有一個整數權重)。


現在,例如,我想擁有它們之間權重最高的10個節點組合。所以我的查詢看起來像這樣:

MATCH (n:PERSON)-[r:WORKED_WITH]->(m:PERSON) 
RETURN n.name, m.name, r.weight 
ORDER BY r.weight DESC 
LIMIT 10; 

正如我最近讀到它是不可能對一個關係的屬性創建索引。我讀過你可以創建像< 50,50-100,> 100這樣的分區的節點作爲例子,但是這並不像最佳實踐......有沒有可能使用類似於(不等式)索引的東西?或者,你認爲解決這類問題有效嗎?

問候 沃爾夫岡

回答

0

斯特凡Armbruster的解釋點(和你的選擇)以及在How to create an index on a property of a relation。 (如果沒有其他方法可以減少初始搜索)......那麼您可能需要對其進行重新編碼(作爲節點)。這可能確實不「感覺」正確,但這是最佳實踐。

希望這有助於 湯姆

+0

非常感謝您的回答,我已經讀過那個帖子,但沒想到卻正好擊中我的問題...... –

+0

問題是你的入口點到圖形。如果我很好地理解你的解釋(如果不是,請糾正我),唯一的決定因素是關係上的財產。如果是這樣,你的選擇是有限的(如果你想要的東西是快速的)。 –

+0

我不想改變每個新任務的數據模型......我想到了一些像Neo4j基於這個屬性強制內部排序的東西......所以我可以輕鬆地說rel.weight> 50或者介於30和30之間50 ....我會在以後使用一個jaccard係數,這將更難以分裂... –