我在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实际上是蓝色粉红色节点之间的关系。所以我的问题是:数据架构(在这种情况下)可以在如此高的水平上影响查询的速度吗?如果是,我该怎么办? 我试图使用参数运行查询,但结果是相同的。 n:RealNode的gid也是一个索引值。
答案 0 :(得分:3)
您的数据架构对查询性能有巨大,没有...... 大量影响。通过重新构建查询可以提高性能,但通过更改数据模型,您可以做更多的事情。
模型需要以对现实世界域的准确描述的方式进行选择,但它通常还必须对使用模式做出某些让步。如果您知道要反复进行某些查询,那么选择一个使DBMS可以轻松回答该查询的数据模型是有意义的。在RDBMS世界中,整个思路都在“denormalization”一词中进行了总结。在图形数据库中,概念是相同的,但你采用的方式是不同的。
调整数据模型时要记住的是neo4j擅长快速遍历关系,而且对于所有查询,您需要考虑的数据越少,查询的速度就越快。
所以在你的情况下,我不知道有多少节点通过:CONTAINS
关系从每个其他节点分支出来,但我猜测在层次结构的每个级别你都有很多项目。因此,从第4级到第5级可能不只是添加固定数量的附加节点,但是如果说层次结构的每个级别的节点数量是上述级别的3倍,则越深入,您就越多乘以您需要考虑的数据量。如果它是10倍......那么哎哟。
你有很多不同的选择。一种是创建快捷关系,并“预先实现”查询。想象一下,创建:grandfather
和:greatgrandfather
关系到树的“跳”级别。这会让它变得更快。另一种方法是过滤中间节点或返回节点,这样你就不会考虑所有事情,而是考虑一些子集。
最后,真正巨大的查询总是需要比真正的小查询更长的时间。首先,您必须仔细了解所需的数据以及运行此查询的频率。我不会尝试为不经常运行的查询优化您的数据模型,但如果您一直这样做,您应该查看您的选项。无论你做什么,你对我的询问看起来都会返回大量数据。