【发布时间】:2020-03-10 17:56:00
【问题描述】:
我正在尝试从 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
这正常吗?
对 cmets 的回答:
是的,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 的实例中运行这些查询。我的机器在带有 8 GB RAM 的 Intel Celeron @ 1.60 上运行 Ubuntu。
【问题讨论】:
-
通过“获得一百万个关系”,您的字面意思是您只想要关系而不是节点?另外,
was_at关系类型是否只存在于User和Place节点之间? -
运行查询和迭代的平台是什么?迭代中的计算有多复杂?更清晰的问题会有所帮助。
-
我已编辑问题以回答您的 cmets。请注意,迭代结果只需要一分钟,增加了一个计数器。我还解释了我想做什么,以防你知道更好的方法。如果需要更多信息,请告诉我
标签: python performance neo4j