Neo4j Cypher查询执行嵌套的Foreach时出错

时间:2014-03-09 15:26:18

标签: foreach neo4j cypher

我正在尝试执行以下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)并且它给出了一个错误说法               ` - '预期但'|'结果

知道我哪里错了吗?

2 个答案:

答案 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) )))