【问题标题】:unexpected failure on unique constraint in neo4jNeo4j 中唯一约束的意外失败
【发布时间】:2018-12-21 07:41:57
【问题描述】:

我正在尝试将一些数据从 csv 文件加载到 neo4j 中,并且似乎触发了一个不应该触发的唯一约束错误。特别是,我使用

创建了一个约束
CREATE CONSTRAINT ON (node:`researcher`) ASSERT node.`id_patstats` IS UNIQUE;

然后,在neo4j中插入一些数据后,如果我运行(在neo4j浏览器中)

MATCH (n:researcher {id_patstats: "2789"})
RETURN n

我没有得到任何结果(没有变化,没有记录),但是如果我运行

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///home/manu/proyectos/PTL_RDIgraphs/rdigraphs/datamanager/tmp_patents/person906.csv' AS line
MERGE (n:researcher {`name` : line.`person_name`})
SET n.`id_patstats` = line.`person_id`;

我明白了

Neo.ClientError.Schema.ConstraintValidationFailed: 节点 (324016) 已存在标签researcher 和属性id_patstats = '2789'

文件person906.csv的内容是

manu@cochi tmp_patents $cat person906.csv
person_id,person_name,doc_std_name,doc_std_name_id
2789,"li, jian",LI JIAN,2390

(这是从较大数据集中提取的最小非工作示例;另外,在原始“person906.csv”中,我确保“id_patstats”确实是唯一的)。

有什么线索吗?

编辑:

还在为此苦苦挣扎……

如果我跑步

MATCH (n) 
WHERE EXISTS(n.id_patstats) 
RETURN DISTINCT "node" as entity, n.id_patstats AS id_patstats 
LIMIT 25 
UNION ALL 
MATCH ()-[r]-() 
WHERE EXISTS(r.id_patstats) 
RETURN DISTINCT "relationship" AS entity, r.id_patstats AS id_patstats 
LIMIT 25

(在 neo4j 浏览器中单击以获取 id_patstats 属性的一些示例)我得到了

(no changes, no records)

也就是说,id_patstats 属性没有在任何地方设置。而且

MATCH (n:researcher {`name` : "li, jian"})
SET n.`id_patstats` = XXX;

不管XXX,这总是会触发错误,这(我猜)意味着实际的问题是名称“li, jian”已经存在。虽然我没有对name 属性设置任何约束,但我猜neo4j 是这样的:你试图在一个节点上设置一个唯一属性,该节点匹配一个不一定是唯一的属性(名称);因此该匹配可能会产生多个节点,我无法在所有节点上设置相同的 UNIQUE 属性......所以我什至不会尝试

【问题讨论】:

  • 你最后的认识是正确的。唯一约束被违反了,因为您的 MATCH 到 'li, jian' 匹配多个节点,并且当您尝试将所有这些节点的唯一属性键设置为相同的值时,它违反了您的唯一约束。

标签: neo4j


【解决方案1】:

至少有两名研究人员同名。您不应该按名称 MERGE 然后将 id 添加为属性。您应该通过 id MERGE 并将名称添加为属性,它会正常工作。

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///home/manu/proyectos/PTL_RDIgraphs/rdigraphs/datamanager/tmp_patents/person906.csv' AS line
MERGE (n:researcher {`id_patstats`:line.`person_id`})
SET n.name`=line.`person_name`;

【讨论】:

  • 如果我错了,请纠正我……但这不是一回事,对吧?我想要的是“如果name 已经存在,不要添加相同的name,而是更新它的属性”;您写的是“如果id 已经存在,请更新其name 属性”。后者可能会导致名称被覆盖。无论如何,我都没有收到错误(对MATCH 查询的响应说没有researcherid_patstats,但后来的错误说有)
猜你喜欢
  • 2019-04-28
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多