【发布时间】: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