Java API与Python在Neo4J上的性能对比
我正在使用一个使用Neo4J图的应用程序,该图包含大约1000万个节点。我每天运行的主要任务之一是将新的/更新的节点批量导入到图中,数量大约为100-200万。在将Python脚本与Cypher查询语言相结合进行实验之后,我决定尝试使用JavaAPI构建嵌入式图形,以获得更好的性能结果 我发现使用本机JavaAPI的性能提高了5倍。我正在使用Neo4j 2.1.4,我相信这是最新的。我在其他帖子中读到,嵌入式图形的速度要快一点,但这应该/可能在不久的将来发生变化。我想和任何观察到类似结果的人一起验证我的发现 我在下面加入了一些代码片段,只是为了让大家对所使用的方法有一个大致的了解——代码已经大大简化了 来自cypher/python的示例:Java API与Python在Neo4J上的性能对比,java,python,neo4j,cypher,Java,Python,Neo4j,Cypher,我正在使用一个使用Neo4J图的应用程序,该图包含大约1000万个节点。我每天运行的主要任务之一是将新的/更新的节点批量导入到图中,数量大约为100-200万。在将Python脚本与Cypher查询语言相结合进行实验之后,我决定尝试使用JavaAPI构建嵌入式图形,以获得更好的性能结果 我发现使用本机JavaAPI的性能提高了5倍。我正在使用Neo4j 2.1.4,我相信这是最新的。我在其他帖子中读到,嵌入式图形的速度要快一点,但这应该/可能在不久的将来发生变化。我想和任何观察到类似结果的人一起
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());
}
final Node n=Graph.graphDb.createNode();
用于(最终标签:标签){
n、 添加标签(标签);
}
对于(Map.Entry:properties.entrySet()){
n、 setProperty(entry.getKey(),entry.getValue());
}
谢谢你的洞察力 如果没有适当的绩效衡量标准,很难判断时代的走向。一般来说,Python脚本比Java慢,但该语言编写代码的速度更快,因此您可以用开发速度换取执行速度 例如:上面的代码在Python中运行一小时,在Java中运行12分钟。编写Python版本需要1天,Java版本需要3天。这意味着您需要至少运行代码2天/(60-12)分钟=60次才能达到收支平衡
当然,这个示例只有在您能够等待48分钟让Python完成其工作时才有意义。如果您的系统在导入时处于停机状态,那么60分钟对12分钟将产生巨大的影响,除非您可以在无人关心的夜间运行它。如果您使用Java与Python 3()玩“基准测试游戏”,Java版本的5倍改进当然是合理的。您在这里实际做的是比较两种不同API的速度,并且仅使用两种不同的语言来实现这一点。因此,你不是在比较同类。Python(和其他语言)使用的Java核心API和REST API有不同的习惯用法,例如显式和隐式事务。此外,与RESTAPI相关联的网络延迟将产生巨大的差异,特别是当您为每个创建的节点使用一个HTTP调用时 因此,为了获得更有意义的性能比较,请确保您正在逐个比较:可能通过RESTAPI使用Java,或者对这两个测试都使用Cypher 提示1:通过将多个请求批处理到单个API调用中,通常会比REST获得更好的性能 提示2:RESTAPI永远不会像核心API那样快,因为后者是本机的,而且前者需要经历更多的层