我正在尝试执行以下cypher查询,以在集合节点列表中存在的所有节点之间创建关系。
START n=node(*)
MATCH(n)
WHERE has(n.Gender)
WITH n.Gender as Gender
WITH collect(n) as nodelist
FOREACH (i in RANGE(0,length(nodelist-2))|
FOREACH(si in [nodelist[i]|
FOREACH(si2 in[nodelist[i+1] |
CREATE UNIQUE (si-[:KNOWS]->si2))))
它在nodelist [i]的第二个FOREACH循环中给出了一个错误。
我尝试使用nodelist(i)并且它给出了一个错误说法 ` - '预期但'|'结果
知道我哪里错了吗?
答案 0 :(得分:2)
如果要在集合中的所有节点之间创建已知关系:
MATCH(n)
WHERE has(n.Gender)
WITH collect(n) as nodelist
FOREACH (x IN nodelist |
FOREACH (y IN filter(z IN nodelist WHERE NOT (z=x)) |
MERGE (x)-[:knows]-(y)
)
)
注意你们关系的方向。每个节点将在特定方向上连接到节点列表中的每个其他节点一次。如果你想要双重关系,即a- [knows] - > b以及b - [:knows] - > a,你必须相应地修改查询。
答案 1 :(得分:1)
你的第一个FOREACH应该如下所示。另外我认为第4行在查询中是多余的。如果您想收集性别,您可以直接收集(n.Gender)作为性别。如果你需要使用你需要在第一个n
中传递WITH
的那一行,否则它不会在第二个WITH
子句中被重新定义。您也不需要从START n=node(*)
尝试以下
MATCH(n)
WHERE has(n.Gender)
WITH collect(n) as nodelist,collect(n.Gender) as Gender
FOREACH (i in RANGE(0,length(nodelist)-2)|
FOREACH(si in [nodelist[i]]|
FOREACH(si2 in [nodelist[i+1]] |
CREATE UNIQUE (si)-[:KNOWS]->(si2) )))