【问题标题】:How to include properties with NULL values using Neo4j MERGE如何使用 Neo4j MERGE 包含具有 NULL 值的属性
【发布时间】:2016-11-24 21:45:36
【问题描述】:

我有一个节点表和一个边缘表,它们都可以作为 CSV 文件使用。 我设法通过以下方式加载节点表:

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 与其他 InfoNodes 有关系,例如这些关系存在于具有相同标签的节点之间。 这些关系存储在可作为附加 CSV 文件使用的 Edge 表中。 此 Edge 表的每一行都包含 idfrom 和 idto 字段,这些字段根据 id 属性定义 InfoNode 之间的关系。 Edge 表还包含 3 个表示关系属性的附加字段。 firstproperty 始终是一个字符串,并且从不为 NULL,例如绝不是空字符串。 secondproperty 和 thirdproperty 都是字符串类型,可以有 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 错误消息是:无法使用第二属性的空属性值合并关系。 当我从第二个脚本中删除 secondproperty 字段和 secondproperty: property 时,会出现提到 thirdproperty: Cannot merge relationship using null property value for thirdproperty 的相同类型的错误 当我从前面的脚本中删除 secondproperty 和 thirdproperty 字段和属性时,会创建 InfoNode 之间的 [:RELATIONS] 关系,包括存储为 firstproperty 的 firstproperty 表字段:[:RELATION] 关系的属性。

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

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

【问题讨论】:

  • 相同节点之间是否存在多个关系,但某些属性的值不同?还是 (idfrom, idto) 对都是唯一的?
  • :InfoNodes 可以与其他 :InfoNodes 有 1 个或多个关系,但在多个关系的情况下,每个关系都有自己的标签。因此,InfoNod 之间的多个关系在 Edge 表中确实具有自己唯一的 idfrom/idto,并具有自己的关系属性作为字段。

标签: neo4j cypher


【解决方案1】:

您需要重新查看开发人员指南中的MERGE section。具体来说,在介绍中,提到了 ON CREATE 和 ON MATCH。这允许您在 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)

【讨论】:

  • 谢谢 InverseFalcon。我承认,我是 Cypher 的新手,这是个秘密。我确实尝试了 ON CREATE 和 ON MERGE 子句,但我确实理解并成功了。通过您的回答,我确实了解这些条款的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2012-02-02
  • 2016-12-02
相关资源
最近更新 更多