Neo4j Cypher—在两个节点数组之间创建关系的最佳方法

Neo4j Cypher—在两个节点数组之间创建关系的最佳方法,neo4j,cypher,Neo4j,Cypher,我有两个节点数组 TYPE1 : [Node1, Node2, ...NodeN] TYPE2 : [OtherNode1, OtherNode2....OtherNodeN] 我正在尝试将每个TYPE1节点连接到其相应的TYPE2节点,如下所示 (Node1) -[:RELATED_TO] -> (OtherNode1) 这是一个简单的一对一的通信 我曾经 MATCH (x:TYPE1),(y:TYPE2) with x, y with COLLECT(x) as n1, COLLE

我有两个节点数组

TYPE1 : [Node1, Node2, ...NodeN]
TYPE2 : [OtherNode1, OtherNode2....OtherNodeN]
我正在尝试将每个TYPE1节点连接到其相应的TYPE2节点,如下所示

(Node1) -[:RELATED_TO] -> (OtherNode1)
这是一个简单的一对一的通信

我曾经

MATCH (x:TYPE1),(y:TYPE2)
with x, y
with COLLECT(x) as n1, COLLECT(y) as n2
FOREACH(i in RANGE(0, 9) |
   CREATE (n1[i])-[:RELATED_TO]->(n2[i])
)
这与

错误:无效输入“[”:应为标识符字符、节点标签、属性映射“)”或关系模式(第4行第21列)

我有两个问题

  • 我在查询中做错了什么

  • 完成我正在做的事情的最佳方式是什么


  • 非常感谢!

    考虑以下示例数据:

    FOREACH (i IN range(1,10) | CREATE (:TYPE1), (:TYPE2))
    
    因为您对按任何属性对集合排序不感兴趣,所以您只需按
    匹配
    中找到的任何顺序连接节点即可。以下查询将执行(我认为)您尝试执行的操作,尽管它不美观:

    MATCH (x:TYPE1), (y:TYPE2)
    WITH COLLECT(DISTINCT x) AS n1, COLLECT(DISTINCT y) AS n2
    WHERE LENGTH(n1) = LENGTH(n2)
    FOREACH (i IN RANGE(0, LENGTH(n1) - 1) |
        FOREACH (node IN [n1[i]] |
            FOREACH (othernode IN [n2[i]] |
                MERGE (node)-[:RELATED_TO]-(othernode)
            )
        )
    )
    
    浏览器视图发布查询:


    考虑以下示例数据:

    FOREACH (i IN range(1,10) | CREATE (:TYPE1), (:TYPE2))
    
    因为您对按任何属性对集合排序不感兴趣,所以您只需按
    匹配
    中找到的任何顺序连接节点即可。以下查询将执行(我认为)您尝试执行的操作,尽管它不美观:

    MATCH (x:TYPE1), (y:TYPE2)
    WITH COLLECT(DISTINCT x) AS n1, COLLECT(DISTINCT y) AS n2
    WHERE LENGTH(n1) = LENGTH(n2)
    FOREACH (i IN RANGE(0, LENGTH(n1) - 1) |
        FOREACH (node IN [n1[i]] |
            FOREACH (othernode IN [n2[i]] |
                MERGE (node)-[:RELATED_TO]-(othernode)
            )
        )
    )
    
    浏览器视图发布查询:


    对应的节点是否具有可比较的共享属性?例如,是否存在Node1.id=OtherNode1.id的情况?从您的示例中,似乎您希望将一个
    TYPE1
    节点与一个
    TYPE2
    节点连接,但您不关心哪个节点(因为
    匹配
    将以任意顺序返回内容)如果你真的想,你可以写一个查询来做这件事,但是我想你已经有了一些方法来判断哪个
    TYPE1
    节点属于哪个
    TYPE2
    节点?克里斯,谢谢你指出这一点……我需要按顺序连接它们……因为它们是按排序顺序创建的。所以,为了澄清,顺序很重要。Nicole,t这里没有关于共享属性的更多信息。杰克,请接受并投票表决答案。相应的节点是否具有可比较的共享属性?例如,是否存在Node1.id=OtherNode1.id的位置?从您的示例中,似乎您想要将一个
    TYPE1
    节点与一个
    TYPE2连接起来
    节点,但您不关心哪个节点(因为
    匹配将以任意顺序返回内容)如果你真的想,你可以写一个查询来做这件事,但是我想你已经有了一些方法来判断哪个
    TYPE1
    节点属于哪个
    TYPE2
    节点?克里斯,谢谢你指出这一点……我需要按顺序连接它们……因为它们是按排序顺序创建的。所以,为了澄清,顺序很重要。Nicole,t这里没有关于共享属性的更多信息。杰克,请接受并投票回答。