这对于任务而言效率更高:Xquery或Cypher

时间:2018-11-22 13:54:42

标签: xml performance neo4j cypher xquery

我想描述两种情况,其中系统有一个较大的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中执行基本的读/写/更新/删除操作。

很高兴知道哪个版本的系统具有更好的性能以及原因!

1 个答案:

答案 0 :(得分:0)

最好的方法是同时实施这两种方法,对它们进行压力测试,并自行评估性能差异是否足以证明不采用更简单/更易于维护的解决方案。您的帖子中有很多因素可能会影响结果,例如;您正在使用什么xquery实现? GUI,XML和Neo4j是否都在同一服务器上?网络硬件,使用负载和服务器规格;数据大小(您建议的大小听起来像您的数据可以视为一个“玩具”项目,因此性能可能是一个争论点。也就是说,您的节点或关系少于100万)


也就是说,我想花钱做Neo4j Cypher。网络(或较小程度的跨应用程序)通信速度很慢(在计算机时间内),并且由于您要同时使用这两种方法,因此无论如何都要付出这笔费用(由于GUI发起了两个调用,因此使用XQuery解决方案是两次)

XQuery很可能必须对XML文件进行扫描(我不知道没有索引怎么可能工作),而Neo4j是为关系遍历而设计的。每个查询都是针对内部索引的二分搜索(本质上可能不完全相同。Cypher计划程序会执行每个查询最有效的操作)。两者都需要磁盘IO,但是Cypher的优势在于Neo4j将一些数据缓存在RAM中以便快速检索,而Neo4j则需要更少的磁盘访问来查找所需的内容。