为什么多次合并的结果会减少?neo4j

为什么多次合并的结果会减少?neo4j,neo4j,multiple-matches,Neo4j,Multiple Matches,我正在尝试从csv导入数据。在这个csv中,有一些列与每行中我的节点(node)的name属性相匹配。然后,我尝试将这些匹配的节点与另一个节点(OtherNode)关联起来。问题是,当我查询多个匹配语句时,节点的数量似乎会随着另一个语句的出现而减少,就像和一样,而不是或 请您解释一下如何从每行给定的多个名称中匹配多组节点?如果您还可以解释为什么添加多个匹配查询时节点数量会减少 LOAD CSV WITH HEADERS FROM "file:///MasterNode.csv" AS row

我正在尝试从csv导入数据。在这个csv中,有一些列与每行中我的节点(node)的
name
属性相匹配。然后,我尝试将这些匹配的节点与另一个节点(OtherNode)关联起来。问题是,当我查询多个匹配语句时,节点的数量似乎会随着另一个语句的出现而减少,就像
一样,而不是

请您解释一下如何从每行给定的多个名称中匹配多组节点?如果您还可以解释为什么添加多个匹配查询时节点数量会减少

LOAD CSV WITH HEADERS FROM "file:///MasterNode.csv" AS row
        MATCH(n1:Node{name: row.`Node Name 1`}),
        (n2:Node{name: row.`Node Name 2`}),
        (n3:Node{name: row.`Node Name 3`}),
        (n4:Node{name: row.`Node Name 4`}),
        (n5:Node{name: row.`Node Name 5`}),
        (n6:Node{name: row.`Node Name 6`}),
        (n7:Node{name: row.`Node Name 7`}),
        (n8:Node{name: row.`Node Name 8`}),
        (n9:Node{name: row.`Node Name 9`}),
        (on:OtherNode{name: row.`Other Node Name`})
        MERGE (on)-[:DEPENDS_ON]->(n1)
        MERGE (on)-[:DEPENDS_ON]->(n2)
        MERGE (on)-[:DEPENDS_ON]->(n3)
        MERGE (on)-[:DEPENDS_ON]->(n4)
        MERGE (on)-[:DEPENDS_ON]->(n5)
        MERGE (on)-[:DEPENDS_ON]->(n6)
        MERGE (on)-[:DEPENDS_ON]->(n7)
        MERGE (on)-[:DEPENDS_ON]->(n8)
        MERGE (on)-[:DEPENDS_ON]->(n9)

匹配不是可选的。当您使用MATCH时,您正在请求图形中模式的现有匹配项,如果图形中没有匹配项,则该行将被删除(返回结果或继续处理不符合您所寻找的结果是没有意义的)

如果您不知道该节点是否存在于图形中,并且即使在这种情况下也希望保留该行,则可以使用可选匹配。但是,您将无法使用空节点结果的变量合并关系。您需要使用条件(使用FOREACH技巧或APOC的条件过程)来实现这一点

通常,在这些情况下,CSV的格式不同,为两列CSV,其中包含
其他节点名称
节点名称
,然后导入如下所示:

LOAD CSV WITH HEADERS FROM "file:///MasterNode.csv" AS row
    MATCH(n:Node{name: row.`Node Name`}),
    (on:OtherNode{name: row.`Other Node Name`})
    MERGE (on)-[:DEPENDS_ON]->(n)
请注意,
Other Node Name
的值在各行之间不会不同……因此,如果将当前CSV转换为此格式,则一行上的内容将转换为9行(每个节点都具有相同的
其他节点名称
,但具有不同的
节点名称
。如果该节点不存在,则该行将被清除,并且从不尝试对该行进行合并

如果您决定使用当前的CSV格式,那么您需要更改查询。通过将节点名称更改为列表,并执行匹配…其中n.name在列表中,我们可以一次对所有节点执行索引查找,忽略任何不匹配的节点,但将它们全部保留在同一个变量下,那么我们只需要一个M为他们所有人建立关系

LOAD CSV WITH HEADERS FROM "file:///MasterNode.csv" AS row
    WITH row, [row.`Node Name 1`, row.`Node Name 2`, row.`Node Name 3`, row.`Node Name 4`, row.`Node Name 5`, row.`Node Name 6`, row.`Node Name 7`, row.`Node Name 8`, row.`Node Name 9`] as nodeNames
    MATCH (on:OtherNode{name: row.`Other Node Name`})
    MATCH(n:Node)
    WHERE n.name IN nodeNames
    MERGE (on)-[:DEPENDS_ON]->(n)

工作起来很有魅力。另一个问题……这是一个错误的查询如何工作的?它是否尝试在第一行匹配以查找名字?如果没有找到,则移动到第二行?如果它确实匹配,则它是否尝试并继续进行第二个匹配?您可以解释查询以生成一个查询计划,其中显示查询将如何执行已执行。请记住,您的输入是CSV中的行,因此只有当这些节点中的每一个都具有给定的节点名称时,您的原始匹配才会成功。如果找不到这些节点中的任何一个,则匹配失败,并且不会为该输入行生成行以供进一步处理(合并操作)。