【问题标题】:Neo4j python driver - it is very slow to iterate through the resultsNeo4j python驱动程序-遍历结果非常慢
【发布时间】: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

这正常吗?

对 cme​​ts 的回答:

是的,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 关系类型是否只存在于UserPlace 节点之间?
  • 运行查询和迭代的平台是什么?迭代中的计算有多复杂?更清晰的问题会有所帮助。
  • 我已编辑问题以回答您的 cmets。请注意,迭代结果只需要一分钟,增加了一个计数器。我还解释了我想做什么,以防你知道更好的方法。如果需要更多信息,请告诉我

标签: python performance neo4j


【解决方案1】:

我找到了这个链接:

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

在那里,一位用户发现拥有 DateTime 属性会使该过程变得非常慢。

在我的情况下,将日期时间转换为纪元后,当我只返回一些属性时,时间改进为 20 秒。 因此,我认为还有改进的余地。

我会看一下并用调查结果更新这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2022-12-07
    相关资源
    最近更新 更多