Я пытаюсь получить миллион отношений от 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 ГБ ОЗУ.