【问题标题】:Very slow to make relationship between the nodes in py2neo在py2neo中建立节点之间的关系非常慢
【发布时间】:2015-03-24 23:24:30
【问题描述】:

我有超过 50,000 个称为 weblogs 的节点,我正在尝试根据其属性连接两个节点,我的代码如下所示:

#!/usr/bin/env python

from py2neo import neo4j, Node, Relationship, Graph, GraphError
from py2neo.packages.httpstream import http

http.socket_timeout = 99999
graph = Graph()
relation_counter = 0
for node in graph.find("Weblogs"):

    matches = graph.match(start_node=node, rel_type="hasDirectLinks")
    if not matches:
        continue


        for relation in matches:

            for weblog_node in graph.find("Weblogs", "entry_url", relation.end_node.properties["url"]):

               if weblog_node:
                   graph.create_unique(Relationship(node, "hasDirectLinks", weblog_node))
                   relation_counter += 1 
                   if relation_counter % 30 == 0:
                       print (relation_counter, ": Numbers of Relationship made")


print (relation_counter, ": Total numbers of relationship made")

代码运行良好,但速度很慢,有什么建议可以让它更快吗?

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

    哇,伙计,您在这里非常努力地尝试做某事(我认为)相当简单。 :) 是的,我认为你可以改进这一点!

    您似乎正在尝试匹配某些类型的博客模式,然后在间接相关的博客之间创建新的直接关系。对吗?

    我已尝试将您的代码重新编写为单个密码查询。 Py2neo 已经lets you execute cypher directly,所以我会仔细检查这个查询,然后运行类似的东西。它将替换您粘贴的所有代码。

    MATCH (blog:Weblogs)-[matches:hasDirectLinks]->(somethingElse)
    WITH matches, blog, somethingElse
    MATCH (weblog_node:Weblogs)
    WHERE weblog_node.entry_url = somethingElse.url
    MERGE (blog)-[newRel:hasDirectLinks]->(weblog_node)
    RETURN count(newRel);
    

    (我将变量命名为与您的 python 所做的相同,因此希望这更容易理解)

    您的代码运行非常缓慢,因为您要连接到一个 REST 端点,并执行大量单独的关系提取以及带有特定标签的节点的单独扫描。这意味着您的代码会花费大量时间来回访问服务器。如果不是手动编程创建哪些关系,而是使用 cypher,那么您可以在单个查询中完成所有节点和所有关系。一次到服务器然后返回,你就完成了。

    我打赌这样做是因为单个密码查询可能会快几十倍。

    Cypher 是你的朋友!如果你学会了它,你将为自己节省大量的编码!

    旅途愉快!

    【讨论】:

    • 感谢您的澄清,但您发布的 Cypher 查询中有一个问题; entry_url 是 Weblogs 的属性,它不是关系。
    • 我刚刚更新了密码查询以使用属性匹配,但概念仍然相同。如果此密码仍然不正确,请仔细考虑并编写您自己的查询,但基本上您的问题的答案是“用一个密码查询替换所有 python 代码,事情会运行得更快”。跨度>
    • Cypher 查询执行良好,直到用于相等性检查的 where 子句,但当它到达合并时,它会永远运行。
    • 在我索引节点 Weblog 及其属性 source_url 后,性能非常快。非常感谢您对 cypher 的深入了解并用 cypher 改写我的所有程序。我接受你的回答。
    • 这个答案+1。高级 py2neo API 的设计目的是易于使用,而不是速度。 Cypher 是处理更复杂用例的正确方法,如果考虑性能,您应该始终尽量减少发出的服务器请求数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多