簡體   English   中英

neo4j密碼查詢可刪除中間節點並將其所有父節點連接到子節點

[英]neo4j cypher query to delete a middle node and connect all its parent node to child node

如果我通過執行此查詢得到一個圖,則我想刪除一個中間節點說“和”,並通過基於相同的“ seqid”使用其對應的傳出關系,將其上一個節點說“ graph”連接到其子節點說“ db” '

MERGE (n:Person { name:  'graph'}) 

MERGE (n:Person { name:  'and'}) 

MERGE (n:Person { name:  'relational'  })

MERGE (n:Person { name: 'nosql'})

MERGE (n:Person { name:  'server'})

MERGE (n:Person { name:  'db'})

MERGE (a:Person { name:  'graph'}) MERGE (b:Person { name:  'and' }) MERGE (a)-[:NEXT{seqid:1}]->(b)

MERGE (a:Person { name:  'and' }) MERGE (b:Person { name:  'db'}) MERGE (a)-[:NEXT{seqid:1 , caps: 'true'}]->(b)

MERGE (a:Person { name:  'relational'}) MERGE (b:Person { name:  'db'}) MERGE (a)-[:NEXT{seqid:1}]->(b)

MERGE (a:Person { name:  'nosql'}) MERGE (b:Person { name:  'db' }) MERGE (a)-[:NEXT{seqid:2, caps: 'true'}]->(b)

MERGE (a:Person { name:  'server'}) MERGE (b:Person { name:  'and' }) MERGE (a)-[:NEXT{seqid:1}]->(b)

MERGE (a:Person { name:  'and' }) MERGE (b:Person { name:  'db'}) MERGE (a)-[:NEXT{seqid:1}]->(b)

MERGE (a:Person { name:  'server'}) MERGE (b:Person { name:  'and'}) MERGE (a)-[:CONNECTS{seqid:2}]->(b)

MERGE (a:Person { name:  'and' }) MERGE (b:Person { name:  'db'}) MERGE (a)-[:CONNECTS{seqid:2, caps: 'true'}]->(b)

(graph)-[:NEXT{seqid:1 , caps: 'true'}]->(db)

(relational)-[:NEXT{seqid:1}]->(db)

(nosql)-[:NEXT{seqid:2, caps: 'true'}]->(db)

(server)-[:NEXT{seqid:1}]->(db)

(server)-[:CONNECTS{seqid:2, caps: 'true'}]->(db)

請幫助我解決這個問題。

(我正在通過嵌入式模式下的java api使用neo4j 2.3.6社區版。)

這里的障礙是關系類型不能動態創建。 您無法檢查傳入的關系,不知道它們的類型,也不能創建相同類型的新關系。

如果您知道需要處理的關系類型並且可以明確解決這些關系,則可以使用Cypher來完成。 這是對所有:NEXT關系執行此查詢的查詢,將關系的屬性從中間節點復制到末端節點,再復制到新創建的關系:

MATCH (middle:Person{name:'and'})
WITH middle
MATCH (from:Person)-[rFrom:NEXT]->(middle)
WHERE exists(rFrom.seqid)
WITH middle, rFrom, from
MATCH (middle)-[rTo:NEXT]->(to:Person)
WHERE rTo.seqid = rFrom.seqid
WITH middle, rFrom, from, rTo, to
CREATE (from)-[rNew:NEXT]->(to)
SET rNew += rTo
DELETE rFrom

您將要對感興趣的每種關系類型重復此操作,並且當與中間節點之間沒有更多的關系時,請刪除該節點。

請注意,如果確實要升級到neo4j 3,則APOC程序庫具有用於圖形重構的程序,這些程序可以輕松解決。

編輯

改變了我上面的Cypher來創建而不是合並。

還刪除了從中間節點到下一個節點的關系的刪除,因為您似乎想從連接中間節點到下一個節點的關系中獲取關系屬性,並且由於可能存在多個到中間節點的傳入關系類型和ID相同,但中間節點與該類型和ID的關系只有一個。

這意味着您具有相同類型和ID的傳入關系的比率不等於具有相同類型和ID的傳出關系的比率,因此我們在創建新關系時將重用這些傳出關系。

只有在完成創建新關系之后,才應該分離並刪除中間節點。

添加另一個滿足所有要求但需要Neo4j 3.0.x或更高版本的答案。 具體來說,這需要APOC Procedures中的apoc.create.relationship()過程,該過程將使我們創建一個具有動態類型的關系,該關系是從matched from關系提供的。

這將立即處理所有關系(至少具有seqid的關系),因此我們應該可以分離並最后刪除中間節點。

MATCH (middle:Person{name:'and'})
WITH middle
MATCH (from:Person)-[rFrom]->(middle)
WHERE EXISTS(rFrom.seqid)
WITH middle, rFrom, from
MATCH (middle)-[rTo]->(to:Person)
WHERE TYPE(rTo) = TYPE(rFrom) AND rTo.seqid = rFrom.seqid
WITH middle, rFrom, from, rTo, to
CALL apoc.create.relationship(from, TYPE(rFrom), PROPERTIES(rTo), to) YIELD rel
DETACH DELETE middle 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM