问题描述
我开始使用 RedisGraph 并在这里得到了一些很好的支持,很高兴有一个围绕它的社区:)
我目前正在尝试实现一个基本的东西:将关系移动到不同的节点:
(bob:User {uid: 1})-[p:Paid {amount: 5,date: "Feb 5 2021 10:10:05"}]->(alice:User {uid: 2})
鲍勃弄错了,他没有付钱给爱丽丝,而是付给约翰,他想修复它。
(bob)-[p]->(john:User {uid: 3})
我必须保留 [p]
的属性,理想情况下我什至会保留相同的 id...
Neo4j 有 apoc.refactor.mergeNodes
函数可以做到这一点,但我不确定如何在 RedisGraph 中实现类似的结果。
似乎有一种使用 SET
、WITH
和 DELETE
的方法,但我无法得到一些语法正确的东西。
有任何线索吗?
感谢分享! :D
解决方法
RedisGraph 没有与 mergeNodes
等效的功能,也不支持更改现有边的端点。
因此,您需要删除原始边并引入新边:
MATCH (bob:User {uid: 1})-[p:Paid {amount: 5,date: "Feb 5 2021 10:10:05"}]->(alice:User {uid: 2}) WITH bob,p,{amount: p.amount,date: p.date} AS props MATCH (john:User {uid: 3}) DELETE p CREATE (bob)-[p2:Paid]->(john) SET p2=props
如果您的程序知道属性值并且可以将它们用作文字,则可以稍微简化一下:
MATCH (bob:User {uid: 1})-[p:Paid {amount: 5,date: "Feb 5 2021 10:10:05"}]->(alice:User {uid: 2}) DELETE p CREATE (bob)-[p2:Paid {amount: 5,date: "Feb 5 2021 10:10:05"}]->(john)
任何一种方法都会导致新边与前一个边具有相同的 ID,因为边 ID 由 DELETE
释放并立即被 CREATE
重用。