我想描述两种情况,其中系统有一个较大的xml文件(包含多个10.000s的数据行)。我的问题是,哪种情况的性能更好,A还是B?
两种情况下的第一步都是相同的:一个函数遍历xml,并将节点和属性放入neo4j数据库中:
.xml --> custom function --> neo4j
此自定义函数的性能无关紧要,因为它只发生一次。
例如,我们不希望知道节点的第N个叔叔。因此,我们查询neo4j并返回请求的节点。
A) 在第一种情况下,我们直接查询neo4j
neo4j <-- query: Cypher <-- GUI
B) 在第二种情况下,我们直接使用Xquery查询xml,然后返回ID。
xml <-- query: Xquery <-- GUI
然后我们从neo4j查询该ID
GUI --> query: Cypher --> neo4j
因此,在第一种情况下,我们查询neo4j并执行读/写/更新/删除基本操作。
在第二种情况下,我们查询xml,仅在neo4j中执行基本的读/写/更新/删除操作。
很高兴知道哪个版本的系统具有更好的性能以及原因!
答案 0 :(得分:0)
最好的方法是同时实施这两种方法,对它们进行压力测试,并自行评估性能差异是否足以证明不采用更简单/更易于维护的解决方案。您的帖子中有很多因素可能会影响结果,例如;您正在使用什么xquery实现? GUI,XML和Neo4j是否都在同一服务器上?网络硬件,使用负载和服务器规格;数据大小(您建议的大小听起来像您的数据可以视为一个“玩具”项目,因此性能可能是一个争论点。也就是说,您的节点或关系少于100万)
也就是说,我想花钱做Neo4j Cypher。网络(或较小程度的跨应用程序)通信速度很慢(在计算机时间内),并且由于您要同时使用这两种方法,因此无论如何都要付出这笔费用(由于GUI发起了两个调用,因此使用XQuery解决方案是两次)
XQuery很可能必须对XML文件进行扫描(我不知道没有索引怎么可能工作),而Neo4j是为关系遍历而设计的。每个查询都是针对内部索引的二分搜索(本质上可能不完全相同。Cypher计划程序会执行每个查询最有效的操作)。两者都需要磁盘IO,但是Cypher的优势在于Neo4j将一些数据缓存在RAM中以便快速检索,而Neo4j则需要更少的磁盘访问来查找所需的内容。