Neo4j 和 Cypher:逆向只有一个箭头
Neo4j and Cypher: Reversing Only One Arrow
假设我的 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)
就不再是parent-less,而MATCH
不会继续对 (b)-->(c)
link 做同样的事情。不幸的是,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)
不幸的是,这和以前一样。
How can I reverse only one arrow in this situation?
有没有办法在继续之前完成第一个箭头逆转交易?
非常感谢您的宝贵时间!
我想我有办法做到这一点。每个节点都有一个唯一的数字 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
,并且只反转相应节点的箭头。
假设我的 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)
就不再是parent-less,而MATCH
不会继续对 (b)-->(c)
link 做同样的事情。不幸的是,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)
不幸的是,这和以前一样。
How can I reverse only one arrow in this situation?
有没有办法在继续之前完成第一个箭头逆转交易?
非常感谢您的宝贵时间!
我想我有办法做到这一点。每个节点都有一个唯一的数字 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
,并且只反转相应节点的箭头。