更改 RedisGraph 关系中的节点引用

问题描述

我开始使用 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 中实现类似的结果。

似乎有一种使用 SETWITHDELETE方法,但我无法得到一些语法正确的东西。

有任何线索吗?

感谢分享! :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 重用。