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

时间:2015-03-24 23:24:31

标签: neo4j py2neo

我有超过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")

代码工作正常,但速度很慢,是否有任何建议让它更快?

1 个答案:

答案 0 :(得分:3)

哇老兄,你在这里努力工作(我认为)非常简单。 :)是的,我认为你可以改进这个!

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

我尝试将您的代码重新表述为单个密码查询。 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是你的朋友!如果你学习了它,你就会为自己节省大量的代码!

快乐的小道!