2016-12-06 71 views
1

我想使用Cypher刪除與Neo4j數據庫中的特定節點相關的連接圖形。用例是刪除「開始」節點以及存在起始節點路徑的所有節點。爲了限制交易,查詢必須是迭代的,並且不得斷開連接的圖。使用Cypher刪除連接的圖形

直到現在我使用此查詢:

OPTIONAL MATCH (start {indexed_prop: $PARAM})--(toDelete) 
OPTIONAL MATCH (toDelete)--(toBind) 
WHERE NOT(id(start) = id(toBind)) AND NOT((start)--(toBind)) 
WITH start, collect(toBind) AS TO_BIND, toDelete limit 10000 
DETACH DELETE toDelete 
WITH start, TO_BIND 
UNWIND TO_BIND AS b 
CREATE (start)-[:HasToDelete]->(b) 

,並調用它,直到刪除節點等於0

有沒有更好的查詢呢?

+0

我認爲你試過了所有連接節點的可變長度路徑和每個連接節點的DETACH DELETE?這是否炸燬你的堆? – InverseFalcon

+0

是的,但問題是查詢不適用於大圖,多次調用查詢可能會破壞連接的圖。 – cde

回答

1

您可以嘗試一種標記和刪除方法,它類似於如何使用變量匹配來分離和刪除整個連接圖,但不使用DETACH DELETE,而是應用TO_DELETE標籤。

像這樣(做了一個標籤使用的起始節點,否則它梳理整個數據庫尋找一個節點與索引PARAM):

MATCH (start:StartNodeLabel {indexed_prop: $PARAM})-[*]-(toDelete) 
SET toDelete:TO_DELETE 

如果炸燬你的堆,可以多次運行它,並在SET之前添加謂詞WHERE NOT toDelete:TO_DELETE,並使用LIMIT和/或可變長度關係深度的限制的組合。

如果您確定已經標記了每個連接的節點,那麼這只是刪除TO_DELETE標籤中的每個節點,您可以反覆運行,或使用APOC過程apoc.periodic.commit()分批處理。