为什么不建议在图形数据库中建立索引

时间:2019-06-11 03:51:47

标签: neo4j graph-theory

在Aleksa Vukotic和Nicki Watt的书Neo4j in Action中,作者说:

  

根据我们的经验,关系索引成为好的解决方案并不常见。我们并不是说关系索引不是一个好习惯,但是,如果您发现自己添加了很多关系索引,那么值得一问。

听起来,作者不建议在图形数据库中建立索引关系,但是此后没有给出解释。有人知道为什么吗?

2 个答案:

答案 0 :(得分:0)

我已投票赞成将这个问题迁移到SO,并在希望它真正迁移的同时回答它。我使用Neo4j几年了。尽管此后它发生了很大变化,但是我相信作为图形数据库的原理不会有太大变化。在我看来,如果您需要大量索引来迅速查询节点之间的关系,则可以以其他方式设计数据模型,使数据模型更多地关注图节点(例如,关系是您的节点,和节点是您在线图中的关系);因为查询机制(例如Cypher查询)通常针对节点进行了优化。

答案 1 :(得分:-1)

首先,了解索引在Neo4j中的作用很重要,因为索引用于查找图形中的起点,然后使用关系遍历和过滤来执行模式匹配的其余部分并完成查询

因此,建议与以下内容大致相同:“我们不建议将关系用作图表中的起点”,并且我们发现这种情况多半是事实。

通常,当您需要进行索引查找时,请牢记某些“事物”作为起点,并且图中的重要事物通常由节点表示。如果我们问“与该特定公司有什么联系的员工”,我们感兴趣的是快速找到该特定公司并进行扩展,而不是在图中找到所有:EMPLOYED_BY关系并由该连接的公司进行过滤,这会感兴趣需要更多时间。

通常,我们发现那些遇到此限制并仍然需要这种快速查找关系的人可能需要重新考虑他们的模型。通常,当需要将关系作为图中的开始位置进行查找时,这表明由关系表示的事物非常重要,以至于它确实应该是图中的一个节点(其自身与先前连接的节点的关系) ),因此这变成了“建模气味”,从而推动了对模型的重构更改。通常,这种更改之后会感觉更自然,并为作为事物建模时没有关系的事物提供更多的功能(例如,将多个标签应用于它或进行连接的能力)通过与更多节点的关系而不仅仅是最初的两个)。

总而言之,在某些情况下,关系确实确实需要成为一种关系(出于业务原因,或者因为它实际上是最实际的建模方式,因此将其保留为关系)并使用这些关系作为图中的起点很有意义。

借助Neo4j 3.5中引入的fulltext schema indexes,我们添加了按关系类型和属性(或属性)添加关系索引的功能。因此,在您排除了模型重构之后,就可以使用该功能。