neo4j中唯一约束意外失败

时间:2018-12-21 07:41:58

标签: neo4j

我正在尝试从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属性独特;因此,该匹配可能会产生多个节点,而我无法在所有节点上都设置相同的UNIQUE属性...因此,我什至不会尝试

1 个答案:

答案 0 :(得分:1)

您的研究人员中至少有两个具有相同的名称。您不应该按名称MERGE,然后将id添加为属性。您应按MERGE的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`;