什么是在neo4j中隔离不相关数据集的最佳方法?

时间:2017-11-13 17:54:47

标签: python neo4j py2neo

我使用neo4j来包含来自不同源系统的临时数据集。我的数据由几个父对象组成,每个对象包含~4-7层不同类型的子对象。每个数据集的总对象数量在2,000到150万之间。我使用的是python py2neo库,它在数据创建阶段都有良好的性能,并且可以通过cypher查询进行报告。

我想从不相关的系统中隔离数据集以进行查询和清除,但我担心性能问题。我有一些想法,但我不清楚哪些是最有可能的。

  1. 最容易实现(对于我的代码)将是一个顶级&#34;项目&#34;宾语。那个项目对象将有一些直接的孩子(通过关系)和许多间接的孩子。我担心当我想按项目过滤时,我必须使用关系通配符MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object)距离,这在查询方面似乎非常昂贵。

  2. 我还可以在项目对象和项目中的每个其他对象之间建立直接关系。 MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object)这对于编写查询应该更容易,但我不知道当我有一个可能有数百万关系的单个对象时会发生什么。

  3. 最后,我可以在数据集中的每个对象上设置project-id属性。 MATCH (c:child_object {project-id:"A1B2C3"})这似乎是一个浪费的解决方案,但我认为在图表数据库模型中可能会有更好的性能。

  4. 如果我破坏了样本Cypher查询/ neo4j术语,请道歉。我把这个项目搁置了6个星期,我有点生疏了。

1 个答案:

答案 0 :(得分:1)

如果您有一组有限的数据集,则应考虑使用专用标签来指定数据源。在Neo4j的属性图数据模型中,允许节点具有multiple labels

MATCH (c:child_object:DataSourceA)

标签始终被编入索引,因此性能应优于您的建议1-3。我也认为这是一个更优雅的解决方案 - 但是,如果您不知道前面的数据集的数量,它将变得棘手。在后一种情况下,您可能会使用类似

的内容
MATCH (c:child_object)
WHERE 'DataSourceA' IN labels(c)

但这更像是一个“全表扫描”,因此在性能方面,您最好使用方法3并在project-id上构建索引。