繁体   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