我正在使用一个使用包含大约1000万个节点的Neo4J图的应用程序。我每天运行的主要任务之一是将新的/更新的节点批量导入图表,大约1-2百万。在结合使用Python脚本和Cypher查询语言进行实验后,我决定尝试使用Java API嵌入图形,以获得更好的性能结果。
我发现使用本机Java API提高了5倍。我正在使用Neo4j 2.1.4,我相信这是最新的。我在其他帖子中读过嵌入式图表有点快,但这应该/可能会在不久的将来发生变化。我想与观察到类似结果的任何人一起验证我的发现吗?
我在下面添加了一些片段,只是为了给出一般使用的方法 - 代码已经大大简化了。
来自cypher / python的样本:
cnode = self.graph_db.create(node(hash = obj.hash,
name = obj.title,
date_created = str(datetime.datetime.now()),
date_updated = str(datetime.datetime.now())
))
使用java的嵌入式图表示例:
final Node n = Graph.graphDb.createNode();
for (final Label label : labels){
n.addLabel(label);
}
for (Map.Entry<String, Object> entry : properties.entrySet()) {
n.setProperty(entry.getKey(), entry.getValue());
}
感谢您的见解!
答案 0 :(得分:4)
您在这里实际做的是比较两种不同API的速度,仅使用两种不同的语言来做到这一点。因此,你不是喜欢比较。 Python核心API和Python(以及其他语言)使用的REST API具有不同的习惯用法,例如显式和隐式事务。此外,与REST API相关联的网络延迟将产生很大的不同,特别是如果您为每个创建的节点使用一个HTTP调用。
因此,为了获得更有意义的性能比较,请确保您正在进行比较:通过REST API使用Java或者使用Cypher进行两种测试。
提示1:通过将大量请求批量处理到单个API调用中,您将获得更好的REST性能。
提示2:REST API永远不会像核心API一样快,因为后者是原生的,而前者有更多的层可以通过。
答案 1 :(得分:0)
如果没有适当的性能测量,很难说时间在哪里。通常,Python脚本比Java慢,但编写代码的语言更快,因此您可以将开发速度换成执行速度。
例如:上面的代码在Python中运行需要一个小时,在Java中需要12分钟。编写Python版本花了1天时间,Java版本花了3天时间。这意味着你需要运行代码至少2天/(60 - 12)分钟= 60次才能达到收支平衡。
当然,只要您能够等待48分钟让Python完成工作,这个例子才有意义。如果您的系统在导入时停机,那么60对12分钟会产生巨大的差异 - 除非您可以在夜间无人问津的情况下运行它。
答案 2 :(得分:0)
如果您使用Java与Python 3(http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=java&lang2=python3&data=u32)玩“基准测试游戏”,Java版本的5倍改进肯定是合理的。