почему allshortestpath такой медленный? - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю графическую базу данных с библиотекой python и neo4j. График имеет 50 тыс. Узлов и 100 тыс. Отношений.

Как создавать узлы:

CREATE (user:user {task_id: %s, id: %s, root: 1, private: 0})

Как создавать отношения:

 MATCH (root_user), (friend_user) WHERE root_user.id = %s
                                  AND root_user.task_id = %s  
                                  AND friend_user.id = %s
                                  AND friend_user.task_id = %s
                    CREATE (root_user)-[r: FRIEND_OF]->(friend_user) RETURN root_user, friend_user 

Как мне искать все пути между узлами:

MATCH (start_user:user {id: %s, task_id: %s}), 
      (end_user:user {id: %s, task_id: %s}), 
      path = allShortestPaths((start_user)-[*..3]-(end_user)) RETURN path

Так что это очень медленно, около 30-60 минут на графике 50k. И я не могу понять почему. Я пытаюсь создать индекс так:

CREATE INDEX ON :user(id, task_id)

но это не поможет. Вы можете мне помочь? Спасибо.

1 Ответ

0 голосов
/ 03 апреля 2019

Вы никогда не должны генерировать длинный запрос Cypher, который содержит N небольших вариаций по существу того же самого кода Cypher.Это очень медленно и занимает много памяти.

Вместо этого вы должны передавать параметры в гораздо более простой запрос Cypher.

Например, при созданииузлы, вы можете передать параметр data следующему коду шифра:

UNWIND $data AS d
CREATE (user:user {task_id: d.taskId, id: d.id, root: 1, private: 0})

Значение параметра data, которое вы передадите, будет списком карт, и каждая карта будет содержать taskIdи id.Предложение UNWIND "раскручивает" список data в отдельные d карты.Это было бы намного быстрее.

Нечто подобное необходимо сделать с вашим кодом создания отношений.

Кроме того, чтобы использовать любой из ваших :user индексов, ваш MATCHпредложение ДОЛЖНО указывать метку :user в соответствующих шаблонах узлов.В противном случае вы просите Cypher сканировать все узлы независимо от метки, и такой тип обработки не сможет использовать преимущества индексов.Например, соответствующий запрос должен начинаться с:

MATCH (root_user:user), (friend_user:user)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...