neo4j中唯一约束的意外故障

neo4j中唯一约束的意外故障,neo4j,Neo4j,我试图将一些数据从csv文件加载到neo4j中,似乎在不应该的时候触发了一个唯一的约束错误。特别是,我使用 CREATE CONSTRAINT ON (node:`researcher`) ASSERT node.`id_patstats` IS UNIQUE; 然后,在neo4j中插入一些数据后,如果我运行(在neo4j浏览器中) 我没有得到任何结果(没有更改,没有记录),但是如果我运行 USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'fi

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

CREATE CONSTRAINT ON (node:`researcher`) ASSERT node.`id_patstats` IS UNIQUE;
然后,在neo4j中插入一些数据后,如果我运行(在neo4j浏览器中)

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

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) 已存在标签
research
和属性
id\u 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
属性的一些示例)我得到

也就是说,
id\u patstats
属性没有设置在任何位置。而且

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

无论XXX如何,这都会触发一个错误,这(我猜)意味着实际的问题是“li,jian”这个名字已经出现了。虽然我没有对
name
属性设置任何约束,但我猜neo4j是这样的:您试图在节点上设置一个唯一的属性,该属性与不一定唯一的属性(名称)匹配;因此,这种匹配可能会产生多个节点,而我无法在所有节点上设置相同的唯一属性……因此我甚至不会尝试至少两名研究人员同名。您不应该按名称合并,然后将id添加为属性。您应该
按id合并
,并将名称添加为属性,这样就可以正常工作了

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`;

如果我错了,请纠正我…但这不是一回事,对吗?我想要的是“如果
名称
已经存在,不要添加相同的
名称
,而是更新其属性”;您写的是“如果
id
已经存在,请更新其
名称
属性”。后者可能导致名称被覆盖。在任何情况下,我都没有得到错误(对
匹配
查询的响应表明没有
研究人员
具有该
id\u patstats
,但后面的错误表明有)您最后的认识是正确的。唯一约束被违反,因为与“li,jian”的匹配匹配多个节点,并且当您尝试将所有这些节点的唯一属性键设置为相同值时,它违反了唯一约束。
MATCH (n:researcher {`name` : "li, jian"})
SET n.`id_patstats` = XXX;
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`;