首页 文章

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

提问于
浏览
1

我有一个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,这很好 .

InfoNode与其他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之间的关系,包括存储为first属性的第一属性表字段:[:RELATION]关系的属性 .

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

Can't MERGE with null values; 'Cannot merge node using null property value' in neo4j描述了同样的问题,但是如果多个字段/属性具有NULL值,则不回答我的问题 .

1 回答

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

相关问题