我正在尝试从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)
答案 0 :(得分:0)
MATCH不是可选的。当您使用MATCH时,您正在要求图形中模式的现有匹配项,并且如果图形中不存在匹配项,那么该行将被清除(返回结果或继续处理那些不要坚持要的东西。
如果您不知道该节点是否存在于图形中,并且即使在这种情况下也想保留该行,则可以使用OPTIONAL MATCH。但是,您将无法使用空节点结果的变量来合并关系。您将需要使用条件(使用FOREACH技巧或APOC的条件程序)来执行此操作。
通常,在这种情况下,CSV的格式不同,如带有Other Node Name
和Node 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)