Graph数据库中搜索查询的时间复杂度是多少(特别是 Neo4j )?
我和我有关系数据。我很难使用关系数据库或图表数据库来存储该数据。因此,我希望根据特定数据库的查询的性能和时间复杂性来存储数据。但是,我无法找到Graph数据库查询的性能和时间复杂度。
任何人都可以帮助我吗?
答案 0 :(得分:5)
答案并非如此简单,因为时间复杂性通常取决于您在查询中所做的事情(查询计划器的结果),并非所有时间的复杂性都适用于所有人查询。
我可以为Neo4j说些话(免责声明:我是Neo4j员工)。
我不会对Neo4j中的Lucene索引查找说太多,因为这些通常仅用于按索引查找起始节点,并且表示查询执行时间的一小部分。关系遍历往往是真正的差异表现出来的地方。
一旦找到了起始节点,Neo4j就会通过关系遍历来遍历图形,对于Neo4j来说,它基本上是通过内存追逐指针,这往往是本机图形dbs优于关系dbs的地方:每次遍历追逐指针的成本是恒定的。
对于关系dbs(包括在关系dbs之上构建的图层),关系遍历通常由各种表连接算法完成,这些算法具有自己的时间复杂度(不是O(1)),但通常不能很好地扩展随着连接数的增加(特别是自我/递归连接)。
这使得像Neo4j这样的原生图形数据库可以很好地处理对连接数据的查询,特别是对于非平凡或越来越多的关系遍历(或者如果遍历是无界的,例如对于可达性查询,最短路径,和别的)。查询的成本与查询触摸或遍历的图形部分相关联,而不是数据库中节点的总数,因此当您可以充分约束查询以触及数据库中最小的子图时,它会有所帮助。 / p>
至于您是否使用关系数据库或图表数据库的问题,这取决于数据的连接性和您计划运行的查询。
如果您确定了图形数据库,那么您也可以选择一组不同的标准,例如本机与非本机实现(Neo4j是本机图形数据库并利用无索引邻接对于关系遍历),是否需要ACID(Neo4是ACID数据库),如果需要丰富且富有表现力的查询语言(Cypher是Neo4j的查询语言,请随时学习并与其他人进行比较)。
有关更深入的信息,请参阅Why Graph Databases Outperfrom RDBMS on Connected Data上的DZone文章,以及Neo4j首席科学家Jim Webber撰写的Explaining Graph Databases to a Developer文章。
答案 1 :(得分:2)
实际上,最可能的情况是使用两者 Neo4j 和一些DBMS(像Mongo这样的关系或nosql)。因为在Neo4j中存储所有数据集太难了。
DBMS中的速度遍历节点比Neo4j慢10-100 ++倍。此外,Neo4j还内置了shortestPath(以及许多其他方法)。
此外,可以提到混合解决方案,如ArangoDB。它有图形引擎+基于文档的引擎。但在引擎盖下它是两个独立的表,所以它几乎和Neo4j + DBMS一样不方便。
答案 2 :(得分:0)