英文:
Swapping specific properties of two nodes including relationships in Neo4j
问题
I'm trying to swap multiple properties and all relationships between two nodes in Neo4j.
For example-
Node 1 -> {id='id1', name:'ABC', city='London'} belongs to A
Node 2 -> {id='ID1', name:'PQR', city='Paris'} belongs to B
After Query Execution, the result should be-
Node 1 -> {id='id1', name:'PQR', city='Paris'} will belong to B
Node 2 -> {id='ID1', name:'ABC', city='London'} will belong to A
Note: id is case-sensitive hence two nodes with similar text are present. We don't want to swap id property.
Tried doing it with set properties(node)
and Temp node like-
MATCH
(node1 {id: 'id1'}),
(node2 {id: 'ID1'})
CREATE (Temp:Student{properties(node1)})
AND SET node1.name = node2.name, node1.city = node2.city
AND SET node2.name = Temp.name, node2.city = Temp.city
AND DELETE Temp
RETURN node1,node2
Getting following error
Invalid input '(': expected "}" (line 4, column 33 (offset: 99))
"CREATE (Temp:Student{properties(node1)})"
Wanted to know if it's possible without creating a Temp node.
Thank you.
英文:
I'm trying to swap multiple properties and all relationships between two nodes in Neo4j.
For example-
Node 1 -> {id='id1',name:'ABC',city='London'} belongs to A
Node 2 -> {id='ID1',name:'PQR',city='Paris'} belongs to B
After Query Execution, the result should be-
Node 1 -> {id='id1',name:'PQR',city='Paris'} will belong to B
Node 2 -> {id='ID1',name:'ABC',city='London'} will belong to A
Note: id is case-sensitive hence two nodes with similar text are present. We don't want to swap id property.
Tried doing it with set properties(node)
and Temp node like-
MATCH
(node1 {id: 'id1'}),
(node2 {id: 'ID1'})
CREATE (Temp:Student{properties(node1)})
AND SET node1.name = node2.name, node1.city = node2.city
AND SET node2.name = Temp.name, node2.city = Temp.city
AND DELETE Temp
RETURN node1,node2
Getting following error
Invalid input '(': expected "}" (line 4, column 33 (offset: 99))
"CREATE (Temp:Student{properties(node1)})"
Wanted to know if it's possible without creating a Temp node.
Thank you.
答案1
得分: 1
以下查询对我有效:
MATCH (node1:Student {id: 'id1'}),(node2:Student {id: 'ID1'})
CREATE (temp:Student)
SET temp = properties(node1),
node1.name = node2.name, node1.city = node2.city,
node2.name = temp.name, node2.city = temp.city
DELETE temp
RETURN node1, node2
参考链接:https://neo4j.com/docs/cypher-manual/current/clauses/set/#set-copying-properties-between-nodes-and-relationships
如果不指定节点标签Student,对我来说是无法正常工作的。所以我需要将节点标签改为node1:Student,而不仅仅是node1。
英文:
Below query works for me:
MATCH (node1:Student {id: 'id1'}),(node2:Student {id: 'ID1'})
CREATE (temp:Student)
SET temp = properties(node1),
node1.name = node2.name, node1.city = node2.city,
node2.name = temp.name, node2.city = temp.city
DELETE temp
RETURN node1, node2
Without specifying the node label Student, it is not working for me. So I need to put the label node1:Student instead of just node1.
答案2
得分: 1
这是我会编写查询的方式。你的结构是正确的,但有一些语法问题。最大的问题是,在创建Temp节点时,你需要使用SET子句。关于你是否可以避免创建临时节点的问题,我认为这是不可能的,因为通常会覆盖现有的属性。而且,如果你不覆盖它们,你将不得不保留/跟踪旧属性以进行移动。
MATCH
(node1 {id: 'id1'}),
(node2 {id: 'ID1'})
CREATE (Temp:Student {id: node1.id})
SET Temp = properties(node1)
WITH node1, node2, Temp
SET node1 += {name: node2.name, city: node2.city},
node2 += {name: Temp.name, city: Temp.city}
DELETE Temp
RETURN node1, node2
我使用的语法链接如下:
- 复制属性:https://neo4j.com/docs/cypher-manual/current/clauses/set/#set-copying-properties-between-nodes-and-relationships
- 更改属性:https://neo4j.com/docs/cypher-manual/current/clauses/set/#set-setting-properties-using-map
英文:
This is the way I would write the query. You had the right structure, but there were a couple of syntax issues. The biggest one was that you need to use a SET clause when you create the Temp node. To answer your question whether we can avoid creating a temp node, I don't believe that's possible because you typically overwrite existing properties. And, if you don't overwrite them, you would have to retain/track the old properties to move over.
MATCH
(node1 {id: 'id1'}),
(node2 {id: 'ID1'})
CREATE (Temp:Student {id: node1.id})
SET Temp = properties(node1)
WITH node1, node2, Temp
SET node1 += {name: node2.name, city: node2.city},
node2 += {name: Temp.name, city: Temp.city}
DELETE Temp
RETURN node1, node2
Links for syntax I used are here:
答案3
得分: 1
你应该使用 WITH 子句来存储临时值。假设两个节点都有 Student
标签,这个查询应该可以工作:
MATCH
(n1:Student {id: 'id1'}),
(n2:Student {id: 'ID1'})
WITH n1, n2, n1.name AS name1, n1.city AS city1
SET
n1.name = n2.name, n1.city = n2.city,
n2.name = name1, n2.city = city1
RETURN n1, n2
英文:
You should use the WITH clause to store temporary values. Assuming both nodes have the Student
label, this query should work:
MATCH
(n1:Student {id: 'id1'}),
(n2:Student {id: 'ID1'})
WITH n1, n2, n1.name AS name1, n1.city AS city1
SET
n1.name = n2.name, n1.city = n2.city,
n2.name = name1, n2.city = city1
RETURN n1, n2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论