0

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

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

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)
4

1 回答 1

0

MATCH 不是可选的。当您使用 MATCH 时,您要求图形中模式的现有匹配,如果图形中没有匹配,则该行将被清除(返回结果或继续处理结果是没有意义的不要坚持你正在寻找的东西)。

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

通常对于这些情况,CSV 的格式不同,作为带有Other Node Name和的两列 CSV Node Name,然后导入将如下所示:

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. 在这种情况下该节点不存在,该行被清除,并且永远不会尝试对该行进行合并。

如果您决定使用当前格式的 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)
于 2018-08-16T07:05:48.140 回答