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

Why are results of multiple merges reduced? neo4j

我正在尝试从 csv 导入数据。在此 csv 中,每一行中有一些列与我的节点(节点)的 name 属性相匹配。然后我尝试将那些匹配的节点与另一个节点 (OtherNode) 相关联。问题是当我查询多个匹配语句时,节点的数量似乎减少了,就像我有另一个一样,表现得像 and 而不是 or.

您能否解释一下如何匹配每行中给出的多个名称的多组节点?如果您还可以解释为什么随着添加多个匹配查询而减少节点数。

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 不是可选的。当您使用 MATCH 时,您要求图形中模式的现有匹配项,如果图形中没有匹配项,则该行将被清除(对 return 结果没有意义或继续处理不符合您要求的结果)。

如果您不知道该节点是否存在于图中并且即使在这种情况下也希望保留该行,您可以使用 OPTIONAL MATCH。但是,您将无法使用空节点结果的变量合并关系。您需要使用条件(使用 FOREACH 技巧或 APOC 的条件程序)来执行此操作。

通常对于这些情况,CSV 的格式不同,作为具有 Other Node NameNode Name 的两列 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 行(每行相同的 Other Node Name 但不同的 Node Name。在节点不存在的情况下,该行将被清除,并且永远不会尝试对该行进行 MERGE。

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

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)