2015-03-23 2 views
0

У меня возникли проблемы с импортом большого объема данных в экземпляр Neo4j с использованием команды Cypher LOAD CSV. Я пытаюсь загрузить примерно 253 тыс. Пользовательских записей с уникальным user_id. Мой первый шаг, чтобы добавить ограничение уникальности на TjE этикетки, чтобы убедиться, что пользователь был только быть запущен один разNeo4j Cypher Load CSV Failure on Unique Constraint

CREATE CONSTRAINT ON (b:User) ASSERT b.user_id IS UNIQUE; 

Затем я попытался запустить НАГРУЗКИ CSV с периодическими фиксациями, чтобы вытащить эти данные.

Это запрос не удался, так что я пытался объединить записи пользователя перед установкой

USING PERIODIC COMMIT 1000 
load csv with headers from "file:///home/data/uk_users.csv" as line 
match (t:Territory{territory:"uk"}) 
merge (p:User {user_id:toInt(line.user_id)})-[:REGISTERED_TO]->(t) 
set p.created=toInt(line.created), p.completed=toInt(line.completed); 

Изменения периодической фиксации значения не имеет никакого значения, возвращается та же ошибка.

USING PERIODIC COMMIT 1000 
load csv with headers from "file:///home/data/uk_buddies.csv" as line 
match (t:Territory{territory:"uk"}) 
merge (p:User {user_id:toInt(line.user_id), created:toInt(line.created), completed:toInt(line.completed)})-[:REGISTERED_TO]->(t); 

Я получаю следующее сообщение об ошибке:

LoadCsvStatusWrapCypherException: Node 9752 already exists with label Person and property "hpcm_uk_buddy_id"=[2446] (Failure when processing URL 'file:/home/data/uk_buddies.csv' on line 253316 (which is the last row in the file). Possibly the last row committed during import is line 253299. Note that this information might not be accurate.) 

цифры, кажется, совпадают примерно, файл CSV содержит 253315 записей в общей сложности. Периодическая фиксация, похоже, тоже не вступила в силу, количество узлов возвращает только 5446 строк.

neo4j-sh (?)$ match (n) return count(n); 
+----------+ 
| count(n) | 
+----------+ 
| 5446  | 
+----------+ 
1 row 
768 ms 

Я могу понять количество неправильных узлов, если этот идентификатор составляет всего около 5000 строк в CSV-файле. Но есть ли какой-либо метод или команда, которую я могу использовать для успеха этого импорта?

ответ

1

Ты падаешь жертвой общей ошибки с MERGE Я думаю. Относительно запроса cypher, это было бы похоже на мои 10 лучших часто задаваемых вопросов об общих проблемах с cypher. Смотрите, что вы делаете это:

USING PERIODIC COMMIT 1000 
load csv with headers from "file:///home/data/uk_buddies.csv" as line 
match (t:Territory{territory:"uk"}) 
merge (p:User {user_id:toInt(line.user_id), created:toInt(line.created), completed:toInt(line.completed)})-[:REGISTERED_TO]->(t); 

Путь merge works, что в прошлом слияние совпадает по всем отношениям, а не только на узле пользователя. Возможно, вы создаете дубликатов пользователей, которых не должно быть. Когда вы запускаете это слияние, даже если пользователь с такими точными свойствами уже существует, отношение к узлу t не выполняется, поэтому он пытается создать новый пользовательский узел с этими атрибутами для подключения к t, что не является чем-то вы хотите.

Решение состоит в том, чтобы объединить пользователя по отдельности, а затем по отдельности сливаются путь отношения, как это:

USING PERIODIC COMMIT 1000 
load csv with headers from "file:///home/data/uk_buddies.csv" as line 
match (t:Territory{territory:"uk"}) 
merge (p:User {user_id:toInt(line.user_id), created:toInt(line.created), completed:toInt(line.completed)}) 
merge (p)-[:REGISTERED_TO]->(t); 

Обратите внимание на два слияния в конце. Один создает только пользователя. Если пользователь уже существует, он не будет пытаться создать дубликат, и вы, надеюсь, будете в порядке со своим ограничением (при условии, что нет двух пользователей с одним и тем же user_id, но с разными созданными значениями). После того, как вы объедините только пользователя, вы объедините отношения.

Конечный результат второго запроса одинаков, но не должен создавать дубликатов пользователей.

+1

Что-то еще, чтобы принять во внимание, может быть слияние по нескольким свойствам. Я не знаю, изменилось ли это в 2.2, но, по крайней мере, в предыдущих версиях это ** не ** использовало бы индексы схемы. Для того, чтобы использовать индексы, он должен MATCH только на одном свойстве, то есть MERGE (p: User {user_id: toInt (line.user_id) SET [дополнительные свойства ...]. – albertoperdomo

+0

Спасибо @FrobberOfBits, что делает много смысл. – user3132965

+0

@albertoperdomo Спасибо, это был мой следующий вопрос. Это не было проблемой для этого импорта, но я вижу, что проблема возникает в будущем (скажем, если бы я добавил обновленную временную метку). – user3132965

Смежные вопросы