如何解决Neo4j和Cypher:只反转一个箭头
假设我的Neo4j图中有三个节点,它们的定向关系如下:(a)<--(b)-->(c)
。此外,假设(b)
不具有属性visit_type_name
,而(a)
和(c)
都具有。现在,我想做的是将这些箭头中的 只反转 个。目前,哪一个条件都没有关系,尽管能够指定涉及属性的条件,但在哪个条件上进行反转将是不错的选择。我尝试了以下方法:
MATCH(x)-[r]->(y)
WHERE NOT EXISTS(()-->(x))
AND NOT EXISTS(x.visit_type_name)
DELETE r
MERGE(y)-->(x)
我的想法是,将这段代码反转后,例如,将箭头(a)<--(b)
移至(a)-->(b)
,然后(b)
将不再是无父级的,而MATCH
将然后继续操作,并使用(b)-->(c)
链接执行相同的操作。不幸的是,Cypher确实会继续并反转两个箭头,这不是我想要的。因此,我尝试了一下,以为我需要更改Cypher匹配的粒度:
MATCH(y)
WITH y
MATCH(x)-[r]->(y)
WHERE NOT EXISTS(()-->(x))
AND NOT EXISTS(x.visit_type_name)
DELETE r
MERGE(y)-->(x)
不幸的是,这和以前一样。
在这种情况下,我如何只能倒转一个箭头?
是否有办法在继续进行之前完成第一笔箭头冲销交易?
非常感谢您的宝贵时间!
解决方法
我认为我有这样做的方法。每个节点都有一个唯一的数字id
,我可以利用它,如下所示:
MATCH(x)-->(y)
WHERE NOT EXISTS(()-->(x))
AND NOT EXISTS(x.visit_type_name)
WITH MIN(y.id) AS min_y_id,x
MATCH(x)-[r]->(min_y)
WHERE min_y.id = min_y_id
DELETE r
MERGE(min_y)-->(x)
这实际上是挑选出最小的id
,并且只反转对应节点的箭头。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。