neo4j 如何创建与第一个具有相同标签的节点有关系的新节点?

ki1q1bka  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(176)

我正在玩Neo4j和Cypher,但是,我遇到了一个问题,我还不能解决。让我们假设我们有一个这样的节点:name: "Joe"
然后,我将向我的数据库添加一个新的Person节点,该节点也具有name: "Joe"属性。我希望在第一个Person Joe和新的Person Joe之间创建一个关系(并且仅在他们之间!)。到目前为止,我已经尝试了以下查询,但没有得到我想要的结果:

MATCH (p1:Person)
 WHERE p1.name = "Joe" 
 CREATE (p2:Person{name:"Joe"})-[r:SAME_NAME]->(p1))

现在的问题是,它是一种递归地创建新节点的方法,我如何才能实现所需的查询呢?

6xfqseft

6xfqseft1#

玩得开心!

// 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 *
ru9i0ody

ru9i0ody2#

创建操作不关心节点是否已经存在。除非您有唯一索引,否则它将创建一个新节点。请尝试以下查询;

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循环,我们对列表进行迭代,然后创建关系。

相关问题