2016-12-06 38 views
1

可能有人給我講解一下:Neo4j的大型數據庫的簡單查詢

在其建議搜索

在使用節點標籤我這樣做對大型數據庫然而,當Neo4j website(2萬個節點):

MATCH p = (n:Foo)-[r:Bar]->(m:Foo)<-[s:Bar]-(o:Foo) RETURN p LIMIT 1 

它導致了一個可怕的廣度第一次搜索比較一個billon對象,並且函數永遠不會返回。

BFS

標籤少等效另一方面完成在不到一秒鐘。

MATCH p = (n)-[r:Bar]->(m)<-[s:Bar]-(o) RETURN p LIMIT 1 

DFS

有沒有什麼辦法,使標記的版本執行相同類型的搜索?

+0

你使用的是什麼版本的neo4j? – cybersam

+0

你試過指定單向關係嗎? – RustyB

+0

是的,我已經把它放在描述中了,3.0.7版 –

回答

1

這取決於您的數據,但您可以嘗試將該查詢分解爲多個部分,並努力實現最終結果。

MATCH (m:Foo) 
WHERE SIZE((m)<-[:Bar]-(:Foo)) > 1 
WITH m LIMIT 1 
MATCH p = (n:Foo)-[r:Bar]->(m)<-[s:Bar]-(o:Foo) 
RETURN p LIMIT 1 

這也可能是值得一試,如果規劃器將執行不同,如果我們從中心開始查詢:在模式美孚節點,而不是它在做什麼,現在,它是從的每一個可能的終端節點擴展然後運行散列連接來查找中間的節點。

MATCH (m:Foo) 
WITH m 
MATCH p = (n:Foo)-[r:Bar]->(m)<-[s:Bar]-(o:Foo) 
RETURN p LIMIT 1 
+0

非常好,你的第一個建議會碰撞到頭部(第二個給出了慢速散列連接,我猜它是等效的) –