数据架构对查询速度的影响有多大

How much does the architecture of data affect the speed of a query

我在 Neo4j 数据库中有以下节点和关系。 灰色和粉红色节点与更多节点进一步连接。 运行 以下查询:

 MATCH (n:RealNode {gid:'$obj_id'})-[:CONTAINS*..3]-(z) 
 RETURN DISTINCT ID(z), z.id,n.id as InternalID"

我很快得到结果(节点n:RealNode不是图像中的节点之一)。

如果我将深度增加到 4,例如:

   MATCH (n:RealNode {gid:'$obj_id'})-[:CONTAINS*..4]-(z) 
   RETURN DISTINCT ID(z), z.id,n.id as InternalID"

响应变得非常慢。我永远不会得到深度为 5 等的响应

深度4其实就是blue-pink节点之间的关系。所以我的问题是:数据架构(在这种情况下)能否在如此大的程度上影响查询速度?如果是,我该怎么办? 我也尝试 运行 查询也使用参数,但结果是一样的。 n:RealNode 的 gid 也是一个索引值。

您的数据架构对查询性能有巨大,没有...巨大影响。通过重新制定查询来提高性能,您可以做很多事情,但通过更改数据模型,您可以做更多的事情。

需要以能够准确描述现实世界领域的方式选择模型,但它通常还必须对使用模式做出某些让步。如果您知道您将反复执行某些查询,那么选择一种数据模型可以让 DBMS 轻松回答该查询是有意义的。在 RDBMS 世界中,整个思路可以用“denormalization”这个词来概括。在图形数据库中,概念相同,但处理方式不同。

调整数据模型时要记住的是,neo4j 擅长快速遍历关系,并且对于所有查询,您需要考虑的数据越少,查询就会越快。

所以在你的情况下,我不知道有多少节点通过 :CONTAINS 关系从每个节点分支出来,但我猜测在层次结构的每个级别你下面都有很多项目它。因此,从第 4 级到第 5 级可能不仅仅是添加固定数量的额外节点,但如果说层次结构的每个级别的节点数是上一级的节点数的 3 倍,那么你走得越深,你就越多乘以您必须考虑的数据量。如果是 10 倍……那就哎哟。

你有很多不同的选择。一种是建立快捷关系,"pre-materialize" 查询。想象一下,创建 :grandfather:greatgrandfather 关系到树的 "hop" 层。那会使它更快。另一种方法是过滤中间节点或 return 节点,这样您就不会考虑所有内容,而是考虑一些子集。

最后,非常大的查询总是比非常小的查询花费更长的时间。您必须首先仔细了解您需要什么数据,以及您必须多久 运行 查询一次。我不会尝试针对不常见的 运行 查询优化您的数据模型,但如果您一直这样做,您应该看看您的选择。无论您做什么,您对我的查询看起来都会 return 大量数据。