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

时间:2018-08-16 02:25:46

标签: neo4j multiple-matches

我正在尝试从csv导入数据。在此csv中,有几列与每行中我的node(Node)的name属性匹配。然后,我尝试将那些匹配的节点与另一个节点(OtherNode)相关联。问题是,当我查询多个match语句时,节点数似乎随着我的变化而减少,就像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)

1 个答案:

答案 0 :(得分:0)

MATCH不是可选的。当您使用MATCH时,您正在要求图形中模式的现有匹配项,并且如果图形中不存在匹配项,那么该行将被清除(返回结果或继续处理那些不要坚持要的东西。

如果您不知道该节点是否存在于图形中,并且即使在这种情况下也想保留该行,则可以使用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)