我試圖從使用下面的查詢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;
這種說法正在採取永遠不刪除任何東西,當我檢查例如部門節點。有什麼我在這裏失蹤?
我試圖從使用下面的查詢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;
這種說法正在採取永遠不刪除任何東西,當我檢查例如部門節點。有什麼我在這裏失蹤?
您有沒有在此行中指定的上限的可變長度的路徑:
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或1)是大致最大路徑長度的指數函數。也就是說,如果每個相關節點具有M
關係,並且正在搜索的最大深度(或者如果沒有上限,則最大可能深度)是N
,則在最壞的情況下,可能路徑的數量是(M^N )。例如,如果我們爲M
和N
插入5
和10
,我們得到9,765,625
可能的路徑(以及要刪除的節點和關係的數量相同)。這可能是您的查詢需要很長時間的主要原因。
第二個主要問題是由於neo4j引擎內存不足導致查詢完全失敗,這是由於內存中可能存在大量數據。你顯然還沒有遇到過這個,但你可能會。您可以嘗試通過僅匹配完整路徑(即,最後一個節點沒有其他節點連接到的路徑)來最小化找到的路徑的數量。我不知道你的數據模型,所以我不能向你展示一個Cypher子句來爲你的數據做這件事。但是,如果你這樣做,你的查詢將不得不被修改,以使用找到的路徑中的所有節點,而不僅僅是路徑末端節點。
第二MATCH
子句將只匹配具有比其他r
的至少一個關係dept
節點,因爲可變長度路徑的默認下界爲1的長度。因此,該查詢不會刪除沒有其他關係的dept
節點。您可以通過指定0
的下限來解決此問題,如:[*0..]
。
你有你的WITH
子句的LIMIT 10
,讓您的查詢,只是要試圖刪除一些dept
和n2
節點。另外,由於您不一定刪除完整的路徑,因此最終會出現不再連接到其他任何東西的「斷開連接的子圖」。所以,你應該刪除LIMIT
子句,即使這會讓你的查詢花費更長的時間。
從理論上講,n2
與c
可能相同(但我不知道你的數據模型)。如果您的數據允許這樣做,但您不希望您的查詢刪除c
,則需要在相關的MATCH
子句後面添加一個WHERE
子句以防止該問題(請參見下文)。
由於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是主要問題,可能需要重新考慮數據模型或可能將刪除拆分爲多個查詢。
我不確定更改是或應該是什麼?我對neo4j很新。你能改變我的密碼,以便我能看到你的意思嗎? –
@skone我在編輯中添加了一些細節 –