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

What is an optimal method for isolating unrelated sets of data in neo4j?

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

我想从不相关的系统中分离出数据集以用于查询和清除目的,但我担心性能。我有一些想法,但我不清楚哪个最有可能可行。

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

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

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

抱歉,如果我弄错了示例 Cypher 查询/neo4j 术语。这个项目搁置了6周,有点生疏了

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

MATCH (c:child_object:DataSourceA)

标签总是被索引,所以性能应该比你的建议 1-3 更好。我也认为这是一个更优雅的解决方案——但是,如果您不知道前面的数据集数量,它会变得棘手。在后一种情况下,您可以使用类似

MATCH (c:child_object)
WHERE 'DataSourceA' IN labels(c)

但这更像是一个 "full table scan",所以在性能方面,您最好使用方法 3 并在 project-id 上构建索引。