Драйвер Neo4j python - очень медленно перебирать результаты - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь получить миллион отношений от neo4j, чтобы провести некоторый анализ в python, но для перебора результатов требуется много времени.

Ниже приведен очень упрощенный запрос для примера. Я потратил время, чтобы перебрать 250.000 записей, и результат составил 1 минуту. Я попытался вернуть только те атрибуты, которые мне нужны, проверив, оказал ли объем данных какое-то влияние, но результат был почти таким же.

Это нормально? Разве я не принимаю во внимание что-то важное? Как я могу сделать это быстрее?

Заранее спасибо

from neo4j import GraphDatabase
driver = GraphDatabase.driver(url, auth=(user, password))

query = """
        MATCH (u:User)-[r:was_at]->(p:Place)
        RETURN u, p, r
        LIMIT 250000
    """

session = driver.session()
result = session.run(query)

i = 0
for record in result: 
    i += 1
CPU times: user 57.2 s, sys: 736 ms, total: 58 s
Wall time: 1min 7s

Редактировать:

Обратите внимание, что это занимает одна минута, чтобы повторить результаты, ничего не делая:

i = 0
for record in result: 
    i += 1

Это нормально?

Ответы на комментарии:

Да тип связи was_at существует только между узлами User и Place.

Цель - создать экземпляр Igraph сети. Каждый узел имеет некоторые атрибуты, вы можете увидеть их в следующем примере:

<Record 
  u=<Node id=0 labels={'User'} properties={'followers': 274, 'screen_name': 'PASTORMAURICIOR', 'name': 'PASTORMAURICIOROJAS', 'verified': 'False', 'statuses': 2434, 'created_at': 'Sat May 28 00:03:02 +0000 2011', 'id': '306492469', 'friends': 330}> 
  p=<Node id=982894 labels={'Place'} properties={'id': '8866e09315fffff'}> 
  r=<Relationship id=1556326 nodes=(
     <Node id=0 labels={'User'} properties={'followers': 274, 'screen_name': 'PASTORMAURICIOR', 'name': 'PASTORMAURICIOROJAS', 'verified': 'False', 'statuses': 2434, 'created_at': 'Sat May 28 00:03:02 +0000 2011', 'id': '306492469', 'friends': 330}>, 
     <Node id=982894 labels={'Place'} properties={'id': '8866e09315fffff'}>
    ) type='was_at' properties={'date': neotime.DateTime(2017, 1, 13, 0, 0, 0.0, tzinfo=<UTC>)}>>

Когда я возвращаю только отношение, узлы не включают атрибуты, которые необходимы:

<Record r=<Relationship id=1556326 nodes=(
  <Node id=0 labels=set() properties={}>, 
  <Node id=982894 labels=set() properties={}>
 ) type='was_at' properties={'date': neotime.DateTime(2017, 1, 13, 0, 0, 0.0, tzinfo=<UTC>)}>>

Я создаю экземпляр igraph, создавая список ребер, список атрибутов узлов и список атрибутов ребер.

Я выполняю эти запросы в экземпляре Neo4j 3.5.14. Моя машина работает под управлением Ubuntu на Intel Celeron @ 1.60 с 8 ГБ ОЗУ.

1 Ответ

0 голосов
/ 12 марта 2020

Я нашел эту ссылку:

https://community.neo4j.com/t/performance-problem/1676

Там пользователь обнаружил, что наличие атрибутов DateTime делает процесс действительно медленнее.

В моем случае после преобразования даты и времени в эпоху время улучшилось до 20se c, когда я возвращаю только некоторые атрибуты. Поэтому я полагаю, что еще есть возможности для улучшения.

Я посмотрю и дополню этот ответ результатами.

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