Graph数据库(尤其是Neo4j)中搜索查询的时间复杂度是多少?

我和我有关系数据。我很困惑使用关系数据库或图数据库来存储该数据。因此,我想基于该特定数据库的查询的性能和时间复杂性来存储数据。但是,我找不到Graph数据库查询的性能和时间复杂性。

谁能帮我吗 ?

最佳答案

答案不是那么简单,因为时间复杂度通常取决于您在查询中所做的事情(查询计划程序的结果),所有查询都不存在千篇一律的时间复杂度。

我可以为Neo4j发言(免责声明:我是Neo4j员工)。

对于Neo4j中的Lucene索引查找,我不会多说,因为它们通常仅用于按索引查找起始节点,并且只占查询执行时间的一小部分。关系遍历往往是真正的差异显示出来的地方。

找到起始节点后,Neo4j将遍历关系遍历的图,对于Neo4j而言,它基本上是遍历内存的指针,这往往是本地图dbs胜过关系dbs的地方:遍历遍历,追逐指针的成本不变。

对于关系数据库(包括建立在关系数据库之上的图形层),关系遍历通常是通过各种表连接算法来完成的,这些算法具有各自的时间复杂度(不是O(1)),但通常不能很好地扩展数量的联接数增加(尤其是自我/递归联接)。

这使得诸如Neo4j之类的本地图数据库具有适当的位置,可用于处理对连接数据的查询,尤其是在关系遍历不平凡或数量不断增长的情况下(或者如果遍历是无界的,例如可及性查询,最短路径等) 。查询的成本与查询所接触或遍历的图的部分(而不是数据库中节点的总数)相关联,因此当您可以适当地约束查询以使其接触数据库中最小的子图时,它会有所帮助。

至于您是否要使用关系数据库或图形数据库的问题,这取决于数据和计划运行的查询的连接性。

如果您确实决定使用图数据库,那么您在这里也可以选择,还有一组不同的标准,例如本机和非本机实现(Neo4j是本机图数据库,并利用无索引的邻接关系进行遍历) ),是否需要ACID(Neo4是ACID数据库),以及是否需要一种丰富而富有表现力的查询语言(Cypher是Neo4j的查询语言,请随时学习并与他人进行比较)。

有关更多详细信息,请参见DZone关于Why Graph Databases Outperfrom RDBMS on Connected Data的文章,以及Neo4j首席科学家Jim Webber关于Explaining Graph Databases to a Developer的文章。

09-25 17:58
查看更多