在 neo4j 中隔离不相关数据集的最佳方法是什么?
What is an optimal method for isolating unrelated sets of data in neo4j?
我正在使用 neo4j 来包含来自不同源系统的临时数据集。我的数据由几个父对象组成,每个父对象包含 ~4-7 层不同类型的子对象。每个数据集的对象总数在 2,000 到 150 万之间变化。我正在使用 python py2neo 库,它在数据创建阶段和通过密码查询进行报告时都有良好的性能。
我想从不相关的系统中分离出数据集以用于查询和清除目的,但我担心性能。我有一些想法,但我不清楚哪个最有可能可行。
最容易实现的(对于我的代码)是顶级 "project" 对象。该项目对象将有几个直接子对象(通过关系)和许多间接子对象。我担心当我想按项目过滤时,我将不得不使用关系通配符 MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object)
距离,这在查询方面似乎非常昂贵。
我还可以在项目对象和项目中的所有其他对象之间建立直接关系。 MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object)
这对于编写查询应该更容易,但我不知道当我有一个可能具有数百万个关系的对象时会发生什么。
最后,我可以为数据集中的每个对象设置项目 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
上构建索引。
我正在使用 neo4j 来包含来自不同源系统的临时数据集。我的数据由几个父对象组成,每个父对象包含 ~4-7 层不同类型的子对象。每个数据集的对象总数在 2,000 到 150 万之间变化。我正在使用 python py2neo 库,它在数据创建阶段和通过密码查询进行报告时都有良好的性能。
我想从不相关的系统中分离出数据集以用于查询和清除目的,但我担心性能。我有一些想法,但我不清楚哪个最有可能可行。
最容易实现的(对于我的代码)是顶级 "project" 对象。该项目对象将有几个直接子对象(通过关系)和许多间接子对象。我担心当我想按项目过滤时,我将不得不使用关系通配符
MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object)
距离,这在查询方面似乎非常昂贵。我还可以在项目对象和项目中的所有其他对象之间建立直接关系。
MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object)
这对于编写查询应该更容易,但我不知道当我有一个可能具有数百万个关系的对象时会发生什么。最后,我可以为数据集中的每个对象设置项目 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
上构建索引。