对源信息进行建模以最大化查询性能

时间:2018-10-08 08:31:40

标签: neo4j cypher py2neo

我想知道在Neo4j中建模数据源的最佳方法(就性能而言)。

请考虑以下情形: 我们正在一张图中加入有关音乐领域的不同数据集。数据的范围可以从不同的艺术家和风格到销售信息。重要的是存储此信息的来源。例如。我们是否有来自公共资源(如DBpedia或其他私有资源)的数据? 为了仅对某些数据集运行查询,我们必须将源包含到每个节点(并以最佳方式包含在每个关系中)。当然,一个节点或关系可以有多个来源。

有三种简单的解决方案:

  1. 向每个节点和关系添加一个源属性;将此属性编入索引,并在密码查询中使用它。例如:

    MATCH(n:Artist)WHERE n.source ='DBpedia'return n

  2. 将源作为标签添加到每个节点,并将类型添加到每个关系(我们可以在一个关系上具有多种类型吗?)。例如:

    创建(n:Artist:DBpediaSource:CustomerSource)

  3. 为每个源创建一个单独的节点,并将所有其他节点链接到相应的源节点。例如:

    MATCH(n:Artist)-[:HASSOURCE]-(:DBpediaSource)返回n

当然,对于那些示例,解决方案就性能而言并不重要。但是,在更复杂的查询中和更大的图上(使用几百万个节点和关系)使用源,我们对这一挑战进行建模的方式将对性能产生重大影响。

一个还需要源的更复杂的示例是“子图”的生成。 我们要从一个或多个源中提取所有节点和关系,例如将其导出到新的Neo4j实例,或者将某些图形算法(例如PageRang)限制为该“子图”,而无需创建单独的Neo4j实例。

社区中的任何人都有这样的案例吗?在性能方面建模的最佳方法是什么?也许还有其他解决方案吗?

感谢您的帮助。

0 个答案:

没有答案