如何创建与具有相同标签的第一个节点相关的新节点?
How to create a new node that is in relationship with the first node that has the same label?
我正在玩 Neo4j 和 Cypher,但是,我 运行 遇到了一个我还无法解决的问题。
假设我们有一个这样的节点:(p:Person{name: "Joe"})
然后,我将向我的数据库添加一个新的 Person 节点,该节点也有一个 name: "Joe"
属性。
我想在第一人称乔和新人乔之间建立关系(并且只在他们之间!)。
到目前为止,我已经尝试了以下查询,但没有得到我想要的结果:
MATCH (p1:Person)
WHERE p1.name = "Joe"
CREATE (p2:Person{name:"Joe"})-[r:SAME_NAME]->(p1))
现在的问题是它有点递归地创建新节点。
我怎样才能实现所需的查询?
创建不关心节点是否已经存在。除非你有唯一索引,否则它会创建一个新节点。试试下面的查询;
MATCH (p:Person) WHERE p.name = "Jose"
//collect all persons with name: Jose
WITH collect(p) as persons
//for every jose in the collection persons, pick the first jose and do a connection to every other jose in the list
FOREACH (i in range(0, size(persons) - 2) |
FOREACH (node1 in [persons[i]] |
//this is the other jose on the list
FOREACH (node2 in [persons[i+1]] |
CREATE (node1)-[:SAME_NAME]->(node2))))
FOREACH 就像一个 for 循环,我们遍历列表然后创建关系。
玩的开心!
// create initial nodes
WITH ['Joe', 'Ken', 'Lou'] AS names, [1,2,3,4,5] AS ids
UNWIND names AS name
UNWIND ids AS id
CREATE(p:Person{name:name, id:id})
RETURN p
;
// create new 'same name' nodes with relationship
MATCH(p:Person)
WITH COLLECT(p) AS persons
UNWIND persons AS person
CREATE(p:Person{
name: person.name
, id: person.id + 100
})-[:SAME_NAME]->(person)
RETURN *
我正在玩 Neo4j 和 Cypher,但是,我 运行 遇到了一个我还无法解决的问题。
假设我们有一个这样的节点:(p:Person{name: "Joe"})
然后,我将向我的数据库添加一个新的 Person 节点,该节点也有一个 name: "Joe"
属性。
我想在第一人称乔和新人乔之间建立关系(并且只在他们之间!)。
到目前为止,我已经尝试了以下查询,但没有得到我想要的结果:
MATCH (p1:Person)
WHERE p1.name = "Joe"
CREATE (p2:Person{name:"Joe"})-[r:SAME_NAME]->(p1))
现在的问题是它有点递归地创建新节点。 我怎样才能实现所需的查询?
创建不关心节点是否已经存在。除非你有唯一索引,否则它会创建一个新节点。试试下面的查询;
MATCH (p:Person) WHERE p.name = "Jose"
//collect all persons with name: Jose
WITH collect(p) as persons
//for every jose in the collection persons, pick the first jose and do a connection to every other jose in the list
FOREACH (i in range(0, size(persons) - 2) |
FOREACH (node1 in [persons[i]] |
//this is the other jose on the list
FOREACH (node2 in [persons[i+1]] |
CREATE (node1)-[:SAME_NAME]->(node2))))
FOREACH 就像一个 for 循环,我们遍历列表然后创建关系。
玩的开心!
// create initial nodes
WITH ['Joe', 'Ken', 'Lou'] AS names, [1,2,3,4,5] AS ids
UNWIND names AS name
UNWIND ids AS id
CREATE(p:Person{name:name, id:id})
RETURN p
;
// create new 'same name' nodes with relationship
MATCH(p:Person)
WITH COLLECT(p) AS persons
UNWIND persons AS person
CREATE(p:Person{
name: person.name
, id: person.id + 100
})-[:SAME_NAME]->(person)
RETURN *