Создание отношений между узлами в neo4j очень медленно - PullRequest
0 голосов
/ 21 марта 2019

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

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

Вот небольшой фрагмент запроса, который я пытаюсь выполнить:

MERGE (s0:Chemical{`name`: "10074-g5"})
SET s0.`name`="10074-g5"
MERGE (y0:Gene{`gene-id`: "4149"})
SET y0.`name`="MAX"
SET y0.`gene-id`="4149"
MERGE (s0)-[:INTERACTS_WITH]->(y0)
MERGE (s1:Chemical{`name`: "10074-g5"})
SET s1.`name`="10074-g5"
MERGE (y1:Gene{`gene-id`: "4149"})
SET y1.`name`="MAX"
SET y1.`gene-id`="4149"
MERGE (s1)-[:INTERACTS_WITH]->(y1)

Есть предложения, почему это происходит так медленно?У меня настроены индексы для Chemical-> name и Gene-> gene-id, поэтому я, честно говоря, не понимаю, почему это происходит так медленно.

1 Ответ

4 голосов
/ 21 марта 2019
  1. Большинство ваших предложений SET просто устанавливают для свойств те же значения, которые они уже имеют (как гарантировано предыдущими предложениями MERGE).
  2. Остальные пункты SET, вероятно, необходимо выполнить, только если MERGE создал новый узел. Таким образом, им, вероятно, должно предшествовать ON CREATE.
  3. Вы никогда не должны генерировать длинную последовательность почти идентичного кода Cypher. Вместо этого ваш код Cypher должен использовать параметры , и вы должны передать свои данные в качестве параметра (ов).
  4. Вы сказали, что у вас есть индекс :Gene(id), в то время как ваш код на самом деле требует индекса :Gene(gene-id).

Ниже приведен пример кода Cypher, который использует параметр dataList (список карт, содержащий требуемые значения свойств), который устраняет большинство вышеперечисленных проблем. Предложение UNWIND просто «раскручивает» список на отдельные карты.

UNWIND $dataList AS d
MERGE (s:Chemical{name: d.sName})
MERGE (y:Gene{`gene-id`: d.yId})
ON CREATE SET y.name=d.yName
MERGE (s)-[:INTERACTS_WITH]->(y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...