2016-11-18 4 views
0

У меня есть метка Лицо, которое содержит миллионы узлов. Узлы имеют некоторые свойства, и я пытаюсь добавить новое свойство к узлам из файла CSV. Я пытаюсь сопоставить их по имени и фамилии человека, но запрос слишком медленный. Запрос:Neo4j добавить свойство из CSV в узел

USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 MATCH (p:Person {forename:line1.forename, surname:line1.surname}) SET p.newPersonNumber=line1.newPersonNumber

Я оставил запрос работает в течение, может быть, час, прежде чем я его прекращено. Я что-то не так? Обратите внимание, что у меня есть индексы на forename и surname.

ответ

0

Попробуйте профилирование запрос, чтобы увидеть, если он действительно использует индексы:

PROFILE 
WITH "qwe" AS forename, "asd" AS surname 
MATCH (p:Person {forename: forename, surname: surname}) 
RETURN p 

Если нет, то вы можете заставить его:

WITH "qwe" AS forename, "asd" AS surname 
MATCH (p:Person {forename: forename, surname: surname}) 
USING INDEX p:Person(forename) 
USING INDEX p:Person(surname) 
RETURN p 

Как уже упоминалось в Cypher refcard (курсив мой):

Использование индекса может быть применено, когда Cypher использует субоптимальный индекс или более th следует использовать один индекс.

См. Также главу USING.


Update

С помощью нескольких индексов на одном узле в настоящее время не поддерживается, давайте сосредоточимся назад о том, почему запрос происходит медленно, и действительно ли он что-то делает. Вы можете профилировать фактическое LOAD CSV для подмножества, и посмотреть, если данные совпадают, что угодно:

PROFILE 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 
WITH line1 
LIMIT 10 
OPTIONAL MATCH (p:Person {forename:line1.forename, surname:line1.surname}) 
RETURN p, line1.newPersonNumber 

Таким образом, вы можете проверить, что MATCH находит что-то (то есть имя и фамилия не требуется зачистка или что-то) , и вы также можете проверить, какой индекс более выгоден для запроса: поскольку будет использоваться только один индекс, результаты будут отфильтрованы по другому свойству, и это будет быстрее, если вы используете самый дискриминантный индекс. Если все люди - Джонс, вам лучше использовать индекс по фамилии, но если они все есть, используйте индекс для имени. Если все они у меня есть, у вас проблема с дублированием ... В любом случае, сравнение чисел на шагах фильтрации между двумя профилями (с одним индексом) должно дать вам представление о распределении индексов.

+0

Извините за поздний ответ. В запросе используется только один индекс, а не оба. После запуска 'USING INDEX р: Человек (имя) с использованием индекса р: Лицо (фамилия)' я получаю 'Несколько намеки на ту же переменную не поддерживаются (строка 3, столбец 13 (смещение: 109)) " ИСПОЛЬЗОВАНИЕ ИНДЕКС p: Person (forename) ". Я думаю, что индексы не проблема, потому что я позволяю запрос работает в течение некоторого времени, а затем проверить, есть ли узлы с этим свойством, как это: 'MATCH (р: Person) WHERE EXISTS (p.newPersonNumber) RETURN p', но я получил 0 строк. – Porjaz

+0

Я обновил ответ, чтобы сосредоточиться на отладке и профилировании запроса. –

+0

Использование 'ПРОФИЛЬ' Я вижу, что' MATCH' находит результаты, поэтому я предполагаю, что запрос написан правильно. Кроме того, для меня более полезно иметь индекс на 'forename' (как это сейчас). Я не знаю, что еще может быть проблемой. Также обратите внимание, что файл CSV составляет 4,7 ГБ. – Porjaz

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