使用 py2neo (1.5.1) 和 neo4j (1.9.2),我想知道不同命令的性能(图中大约有 80k 关系):
所以首先我得到所有的关系(~80k),这显然需要一些时间。
graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
rels = graph_db.match()
但是,为什么要花费大量时间(约 1-2 分钟)来遍历关系并打印它们(或存储在某个变量中)?rels
是关系列表,但每个关系包含什么?
for relation in rels:
print relation.start_node
print relation.type
print relation.end_node
print relation.get_properties()
删除该行时print relation.get_properties()
,循环的执行时间会变得更好(约 10 秒)。所以我假设每个人都relation.get_properties()
对数据库执行一个查询?听起来很合理。
然而,对我来说奇怪的是:为什么下面的代码要快得多,即使print relation
包含我需要的所有信息?
for relation in rels:
print relation #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359)
print relation.start_node
print relation.type
print relation.end_node
所以它实际上打印了我需要的所有信息,并且它的执行速度要快得多,即使这就是为什么我无法提取关系的属性并将其存储在变量中的原因。
for relation in rels:
print relation #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359)
print relation.start_node
print relation.type
print relation.end_node
#print relation["since"] #would slow down the execution significantly, why??
那么关系中存储了哪些信息呢?如何在不使用get_properties()
. 这和缓存有关系吗?我不明白,这让我发疯......我已经在期待你的回答了,奈杰尔 ;-)
注意:我知道我可以通过使用批处理来优化它,但这不是现在真正的问题。
编辑:是否print relation["since"]
还会导致每次迭代的查询?
编辑2:当我们谈论性能时,还有一件事:比较以下密码查询,我注意到第一个比第二个慢,为什么?(在冷图上执行,因此没有缓存影响)
查询1:开始n =节点(*)返回n
query2: START n=node(*) RETURN n.name, n.age