如何使用Neo4j MERGE包含具有NULL值的属性

时间:2016-11-24 21:45:36

标签: neo4j cypher

我有一个Node表和一个Edge表,它们都是CSV文件。 我设法通过以下方式加载Node表:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///NodesETL.csv' AS line
CREATE (:InfoNodes {id: toString(line.id), description: toString(line.description)})

此查询使用CSV文件的字段值创建InfoNodes作为属性:InfoNodes,这很好。

InfoNodes与其他InfoNode有关系,例如这些关系存在于具有相同标签的节点之间。 这些关系存储在可用作附加CSV文件的Edge表中。 此Edge表的每一行都包含idfrom和idto字段,这些字段根据其id属性定义InfoNode之间的关系。 Edge表还包含3个表示关系属性的附加字段。第一个属性始终是一个字符串,永远不会为NULL,例如永远不会是空字符串。第二个属性和第三个属性(两个类型字符串)都可以具有NULL值,如“”。因此,secondproperty和/或thirdproperty可以包含NULL值。 我尝试使用此Edge表在(:InfoNodes)之间创建[:RELATIONSHIP {firstproperty:,secondproperty:,thirdproperty:}]关系:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line
MATCH (from:InfoNodes{id: toString(line.idfrom)})
MATCH (to:InfoNodes{id: toString(line.idto)})
MERGE (from)-[:RELATION {firstproperty: toString(line.firstproperty), secondproperty: toString(line.secondproperty), thirdproperty: toString(line.thirdproperty)}]->(to)

当Edge表中的secondproperty和thirdproperty包含NULL值时,第二个Cypher脚本会导致错误。 Neo4j错误消息是:无法使用null属性值为secondproperty合并关系。 当我从第二个脚本中删除第二个属性字段和第二个属性:属性而不是相同类型的错误时提到第三个属性:无法使用null属性值为thirdproperty合并关系 当我从前一个脚本中删除secondproperty和thirdproperty字段和属性时,会创建InfoNode之间的[:RELATIONS]关系,包括存储为first:属性[first]的[:RELATION]关系的第一个属性表字段。

问题:如何扩展第二个脚本以便从Edge表中将第二个属性和第三个属性字段加载到secondproperty:和thirdproperty:of [:RELATION]关系,包括NULL值?

Can't MERGE with null values; 'Cannot merge node using null property value' in neo4j描述了同样的问题但是在多个字段/属性为NULL值的情况下没有回答我的问题。

1 个答案:

答案 0 :(得分:2)

您想要重新审核开发者指南中的MERGE section。具体来说,在介绍中,提到了ON CREATE和ON MATCH。这允许您在MERGE导致创建的情况下设置属性,或者在现有元素上匹配MERGE时设置属性。

通常,您只希望MERGE唯一定义事物的属性(如ID),并将其余属性设置为ON CREATE。

此更改后的查询可能如下所示:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line
MATCH (from:InfoNodes{id: toString(line.idfrom)})
MATCH (to:InfoNodes{id: toString(line.idto)})
MERGE (from)-[r:RELATION {firstproperty: toString(line.firstproperty)}]->(to)
ON CREATE SET r.secondproperty = toString(line.secondproperty), r.thirdproperty = toString(line.thirdproperty)