我有超过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")
代码工作正常,但速度很慢,是否有任何建议让它更快?
答案 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是你的朋友!如果你学习了它,你就会为自己节省大量的代码!
快乐的小道!