2014-10-19 54 views
2

使用Neo4j 2.X和Cypher,我想查詢我直接或通過朋友知道的所有UsersCypher /效率關係基數

我希望是這樣的:

MATCH (me:User("123"))-[:KNOWS*1..2]-(friend) //does not work of course 

我想想shortestPath功能,但不會是太貴了?

而且,如果我有這個疑問:

MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory before filtering by knowledge ! 
WITH shortestPath((me)-[:KNOWS*..2]-(friend)) as path 
WHERE path.length <= 2 

OR

MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory before filtering by knowledge ! 
MATCH path = shortestPath((me)-[:KNOWS*..2]-(friend)) 
WHERE path.length <= 2 

那豈不是更多(也許太龐大圖的情況下?)貴嗎?

事實上,這將是更好的,如果它的工作:

MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS*1..2]-(friend) 

加載在內存中只有合適的路徑。

我也可以用這樣的一種替代方案:

OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-(friend) 
OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-()-[:KNOWS]-(friend) 

但想象一下,如果我想三度分離(知識)的...查詢將是非常多餘。

是否有一個很好的語法會導致一個非常有效的查詢?
我應該使用什麼?

+1

爲什麼第一個查詢不起作用? – JohnMark13 2014-10-19 08:05:18

+0

我剛剛閱讀文檔,並沒有發現這種模式,除了'shortestPath' ..我認爲這個模式是專門用於'shortestPath'的。 – Mik378 2014-10-19 11:14:56

回答

3

我不確定我完全理解,我認爲你的第一個查詢會起作用嗎?

MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User) 
WHERE me <> friend 
RETURN friend 

很難知道該怎麼寫的其他查詢作爲OWNS_BY和SOME_REL成分似乎無關的朋友組成的朋友,如果你可以用一個具體的例子涉及查詢的兩半,我可以解釋一個最佳方法。

一些關鍵的指針,你應該

  1. 與你的想法會匹配最小節點集(約束是必須做的工作)的啓動查詢。
  2. 確保所有查詢組件都使用標籤和關係類型。
  3. 爲將在查找中使用的屬性創建索引。

查詢優化的優秀資源是Wes Freeman's Pragmatic Optimisation

圖的大小並不需要使查詢更昂貴,因爲您將主要工作在可能具有更多固定大小邊界的子圖上。當然,如果您的查詢需要跨越整個圖表,那麼大小將成爲速度問題!

+1

「OWNS_BY和SOME_REL組件似乎與朋友組件的朋友無關」=>的確,這只是一個示例。你寫道:「用你認爲符合最小節點集合的條件開始你的查詢」。這意味着這個查詢應該被拆分嗎?:MATCH(a) - [:SOME_REL] - >(b)< - [:OWNS_BY] - (me:User(「123」)) - [:KNOWS * 1。 .2] - (朋友)我在哪裏<>朋友RETURN朋友?如果我按如下方式分割:MATCH(a) - [:SOME_REL] - >(b)< - [:OWNS_BY] - (me:User(「123」)) MATCH(me) - [:KNOWS * 1..2] - (朋友:用戶) 我在哪裏<>朋友 RETURN friend',是否浪費了一些內存? – Mik378 2014-10-19 11:13:42

+1

感謝Wes的鏈接,我明白現在分裂的好處;)。 :以最小匹配(以返回節點的形式)開始,以便過濾整體,以便簡化和緩解第二次匹配。 – Mik378 2014-10-19 11:59:16