неожиданный сбой по уникальному ограничению в neo4j - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь загрузить некоторые данные в neo4j из CSV-файлов, и кажется, что возникает уникальная ошибка ограничения, когда это не следует делать.В частности, я создал ограничение, используя

CREATE CONSTRAINT ON (node:`researcher`) ASSERT node.`id_patstats` IS UNIQUE;

Затем, после вставки некоторых данных в neo4j, если я запустил (в браузере neo4j )

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

Iне получить результатов ( без изменений, без записей ), но если я запусту

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: Node(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;следовательно, это совпадение может привести к нескольким узлам, и я не могу установить одинаковое свойство UNIQUE для всех них ... поэтому я даже не буду пытаться

1 Ответ

0 голосов
/ 21 декабря 2018

Как минимум два ваших исследователя имеют одинаковые имена.Вы не должны MERGE по имени, а затем добавить идентификатор в качестве свойства.Вы должны 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`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...