Neo4j 在py2neo中建立节点之间的关系非常慢

Neo4j 在py2neo中建立节点之间的关系非常慢,neo4j,py2neo,Neo4j,Py2neo,我有50000多个称为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 no

我有50000多个称为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")

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

哇,伙计,你在这里真的很努力,试图做一些我认为相当简单的事情是的,我想你可以改进这个

似乎您正在尝试匹配某些类型的日志模式,然后在间接相关的日志之间创建新的直接关系。是这样吗

我尝试将您的代码重新格式化为单个密码查询。Py2neo已经存在了,所以我会仔细检查这个查询,然后运行类似的东西。它将替换您粘贴的所有代码

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,那么您可以在一个查询中完成所有节点和所有关系。一次到服务器再返回,就完成了

我敢打赌,作为一个单独的密码查询,这样做可能会快几十倍

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


快乐的小径

哇,老兄,你在这里真的很努力,想做一件我认为相当简单的事是的,我想你可以改进这个

似乎您正在尝试匹配某些类型的日志模式,然后在间接相关的日志之间创建新的直接关系。是这样吗

我尝试将您的代码重新格式化为单个密码查询。Py2neo已经存在了,所以我会仔细检查这个查询,然后运行类似的东西。它将替换您粘贴的所有代码

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,那么您可以在一个查询中完成所有节点和所有关系。一次到服务器再返回,就完成了

我敢打赌,作为一个单独的密码查询,这样做可能会快几十倍

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


快乐的小径

感谢您在您发布的密码查询中澄清了一个问题;entry_url是Weblogs的一个属性,它不是一个关系。我刚刚更新了cypher查询,改为使用属性匹配,但概念仍然相同。如果这个密码仍然不正确,那么仔细考虑并编写您自己的查询,但基本上您的问题的答案是用一个密码查询替换所有python代码,而且运行速度会快得多。Cypher查询在等式检查的where子句之前运行良好,但当它到达合并时,它将永远运行。在我为节点日志及其属性源url编制索引后,性能非常快。非常感谢您对cypher的深入了解,并用cypher重新表述了我的所有程序。我接受你的回答。这个答案+1。高级py2neo API的设计目的是易于使用,而不是速度。对于更复杂的用例,Cypher是正确的方法,如果性能是一个考虑因素,您应该始终尽量减少服务器请求的数量。感谢您澄清您发布的Cypher查询中的一个问题;entry_url是Weblogs的一个属性,它不是一个关系。我刚刚更新了cypher查询,改为使用属性匹配,但概念仍然相同。如果这个密码仍然不正确,那么仔细考虑并编写您自己的查询,但基本上您的问题的答案是用一个密码查询替换所有python代码,而且运行速度会快得多。Cypher查询在等式检查的where子句之前运行良好,但当它到达合并时,它将永远运行。在我为节点日志及其属性源url编制索引后,性能非常快。非常感谢您对cypher的深入了解,并用cypher重新表述了我的所有程序。我接受你的回答。这个答案+1。高级py2neo API的设计目的是易于使用,而不是速度。Cypher是处理更复杂用例的正确方法,您应该始终使用它 k在考虑性能的情况下,尽量减少服务器请求的数量。