2016-02-03 31 views
0

我試圖從使用下面的查詢Neo4j的刪除數據:暗號刪除正在採取永遠

MATCH (c:Customer {customerID: '16af89a6-832b-4bef-b026-eafea3873d69'}) 
MATCH (c)<-[r:DEPT_OF]-(dept:Dept)-[*]-(n2) WITH r, dept, n2 LIMIT 10 
DETACH DELETE r, dept, n2; 

這種說法正在採取永遠不刪除任何東西,當我檢查例如部門節點。有什麼我在這裏失蹤?

回答

1

您有沒有在此行中指定的上限的可變長度的路徑:

MATCH (c)<-[r:DEPT_OF]-(dept:Dept)-[*]-(n2) WITH r, dept, n2 LIMIT 10 

這將導致大量的遍歷。您的數據模型是否允許指定躍點數的上限以匹配n2。另外,您應該爲n2指定一個或多個標籤。

此外,您不需要在DETACH DELETE聲明中包含r。當使用DETACH DELETE時,被刪除節點的任何現有關係也將被刪除。

編輯

圖案(dept:Dept)-[*]-(n2)指示任何長度的雙向路徑(沒有上限)。要指定可變長度路徑上的上限,只需用(dept:Dept)-[*1..3]-(n2)替換該模式的(dept:Dept)-[*]-(n2)部分即可。這會將路徑的長度限制爲(dept:Dept)(n2)之間的最大三個關係(儘管這可能不適合您的數據模型)。這也將是很好的添加標籤和關係方向的模式(適用於你的數據模型),是這樣的:

MATCH (c)<-[r:DEPT_OF]-(dept:Dept)<-[:BELONGS_TO*1..2]-(n2:Product) WITH r, dept, n2 LIMIT 10 
+0

我不確定更改是或應該是什麼?我對neo4j很新。你能改變我的密碼,以便我能看到你的意思嗎? –

+0

@skone我在編輯中添加了一些細節 –

1

有在查詢中許多不同的問題。這是我確定的一個。

  1. 的由可變長度路徑查詢發現路徑的數量(假設下界是0或1)是大致最大路徑長度的指數函數。也就是說,如果每個相關節點具有M關係,並且正在搜索的最大深度(或者如果沒有上限,則最大可能深度)是N,則在最壞的情況下,可能路徑的數量是(M^N )。例如,如果我們爲MN插入510,我們得到9,765,625可能的路徑(以及要刪除的節點和關係的數量相同)。這可能是您的查詢需要很長時間的主要原因。

  2. 第二個主要問題是由於neo4j引擎內存不足導致查詢完全失敗,這是由於內存中可能存在大量數據。你顯然還沒有遇到過這個,但你可能會。您可以嘗試通過僅匹配完整路徑(即,最後一個節點沒有其他節點連接到的路徑)來最小化找到的路徑的數量。我不知道你的數據模型,所以我不能向你展示一個Cypher子句來爲你的數據做這件事。但是,如果你這樣做,你的查詢將不得不被修改,以使用找到的路徑中的所有節點,而不僅僅是路徑末端節點。

  3. 第二MATCH子句將只匹配具有比其他r的至少一個關係dept節點,因爲可變長度路徑的默認下界爲1的長度。因此,該查詢不會刪除沒有其他關係的dept節點。您可以通過指定0的下限來解決此問題,如:[*0..]

  4. 你有你的WITH子句的LIMIT 10,讓您的查詢,只是要試圖刪除一些deptn2節點。另外,由於您不一定刪除完整的路徑,因此最終會出現不再連接到其他任何東西的「斷開連接的子圖」。所以,你應該刪除LIMIT子句,即使這會讓你的查詢花費更長的時間。

  5. 從理論上講,n2c可能相同(但我不知道你的數據模型)。如果您的數據允許這樣做,但您不希望您的查詢刪除c,則需要在相關的MATCH子句後面添加一個WHERE子句以防止該問題(請參見下文)。

  6. 由於MATCH條款過濾掉其中的關係一樣使用了兩次,你的第二個MATCH條款實際上是做一些額外的工作,以確保每個可變長度的路徑,沒有任何關係的任何匹配匹配r。由於您的用例不需要此檢查(修復第5項後),您可以通過拆分第二個MATCH子句來避免不必要的檢查,以便r在其自己的子句中匹配。

這裏是,6個項目3,4,5樣本修正:

MATCH (c:Customer {customerID: '16af89a6-832b-4bef-b026-eafea3873d69'}) 
MATCH (c)<-[r:DEPT_OF]-(dept:Dept) 
MATCH (dept)-[*0..]-(n2) 
WHERE n2 <> c 
DETACH DELETE dept, n2; 

但是,因爲上面沒有解決項目1或2,查詢仍可能需要花費很長的時間和/或失敗。如果您對數據模型提供了更完整的概念,那麼我們可能可以解決項目2.但是,項目1是主要問題,可能需要重新考慮數據模型或可能將刪除拆分爲多個查詢。