2017-02-23 103 views
0

我認爲這很容易,因爲我有一個典型的圖形用例:展開一個節點。Neo4J:展開帶有兒童兒童節點(性能)

MATCH (s:Entity)-[]-(dest) WHERE s._id = 'xxx' 
RETURN dest 

問題Nr.1:有時也有很多孩子,所以我想限制返回計

,如果沒有額外的要求,這是很容易!

MATCH (s:Entity)-[]-(dest) WHERE s._id = 'xxx' 
RETURN dest 
LIMIT 100 

附加要求:返回兒童兒童的所有兒童的ID!

MATCH (s:Entity)-[]-(dest) WHERE s._id = 'xxx' 
WITH collect(dest) as childrenSource 
LIMIT 100 
MATCH (childrenSource)-[]-(childDestination) 
RETURN childrenSource as expandNode, collect(childDestination) as childrenIds 
LIMIT 100 

問題2:的限制是在錯誤的地方,因爲限制之前收集已經做了收集。

可能的解決辦法:

MATCH (s:Entity)-[]-(dest) WHERE s._id = 'xxx' 
WITH collect(dest)[..100] as childrenSource 
LIMIT 100 
MATCH (childrenSource)-[]-(childDestination) 
RETURN childrenSource as expandNode, collect(childDestination)[..100] as childrenIds 

但我不認爲這是一個高性能的解決方案。因爲它需要相當多的時間

確切的問題說明:如果我有1000名兒童1個節點和每個孩子都有另一個1000孩子們,我想執行一個查詢返回的100名兒童,100子ID

------------------------------------------------- 
| node 1 | child id 1_1,.... child id 1_100 | 
| node 2 | child id 2_1,.... child id 2_100 | 
| ...  | ...        | 
| node 100 | child id 100_1,.. child id 100_100 | 
------------------------------------------------- 

其他解決方案:我做了一個簡單的擴展節點。並且比我在每個子節點上調用擴展。但是,做101個查詢而不是1個查詢聽起來不算太高性能。

回答

1

編輯

像往常一樣,APOC Procedures救援。使用apoc.cypher.run(),您可以在子查詢中使用LIMIT,從而將擴展延遲至極限。

MATCH (s:Entity)-[]-(dest) WHERE s._id = 'xxx' 
WITH dest 
LIMIT 100 
CALL apoc.cypher.run(' 
MATCH (dest)-[]-(childDestination) 
RETURN childDestination LIMIT 100 
', {dest:dest}) YIELD value 
RETURN dest as expandNode, COLLECT(value.childDestination) as childrenIds 
+0

這將是一個很好的可能性。但我認爲這個lib與最新的neo4j版本不兼容? 我正在使用Neo4j 3.1.1 CE 我試過了: - apoc 3.0.8.4:服務器沒有再啓動 - apoc 3.1.0.3&3.1.0.2:這隻增加了一個新函數:apoc.schema.assert – mabr

+0

其他在這裏提到了一些事情。你在Windows上嗎? – InverseFalcon

+0

是的,我在windows上使用neo4j(社區版) – mabr