如何为每个节点属性 的每个元素创建节点?

How do you do a for each to create nodes for each element of a node property?

我有代表 作者 属性 的算法的节点。我想为算法作者中的人创建节点,并在这些人和算法之间创建 WORKED_ON 关系。所以我尝试了:

FOREACH (p:author IN al:Algorithm | CREATE (p:PERSON).
(p)-[:WORKED_ON]->(al:Algorithm))

但是 returns:

Invalid input ':': expected "IN" (line 2, column 11 (offset: 156)).
"FOREACH (p:author IN al:Algorithm | CREATE (p:PERSON)"

假设作者 属性 包含一个用逗号分隔的姓名列表,您可以这样做

MATCH (a:Algorithm)

FOREACH( authorName IN SPLIT(a.author,',') |
    MERGE (p:Person {name:authorName})
    MERGE (p)-[:WORKED_ON]->(a)
)

注意:要使 MERGE 快速运行,您应该设置

CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE

FOREACH 适用于集合,因此您必须先收集 Algorithm 节点。像,

MATCH (n:Algorithm) with collect(n) as algos
FOREACH(a in algos | CREATE (p:Person {name: a.author})-[:WORKED_ON]->(a))

但是,创建这些 Person 节点可能有更简单的方法,

MATCH (a:Algorithm) 
CREATE (a)<-[:WORKED_ON]-(:Person {name: a.author})