在 py2neo 中建立节点之间的关系非常慢
Very slow to make relationship between the nodes in py2neo
我有超过 50,000 个称为网络日志的节点,我正在尝试连接两个关于其 属性 的节点,我的代码如下所示:
#!/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 已经 lets you execute cypher directly,所以我会仔细 double/triple 检查这个查询,然后 运行 类似的东西。它将替换您粘贴的所有代码。
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 是你的朋友!如果您学会了它,您将节省大量编码工作!
旅途愉快!
我有超过 50,000 个称为网络日志的节点,我正在尝试连接两个关于其 属性 的节点,我的代码如下所示:
#!/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 已经 lets you execute cypher directly,所以我会仔细 double/triple 检查这个查询,然后 运行 类似的东西。它将替换您粘贴的所有代码。
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 是你的朋友!如果您学会了它,您将节省大量编码工作!
旅途愉快!