我使用neo4j来包含来自不同源系统的临时数据集。我的数据由几个父对象组成,每个对象包含~4-7层不同类型的子对象。每个数据集的总对象数量在2,000到150万之间。我使用的是python py2neo库,它在数据创建阶段都有良好的性能,并且可以通过cypher查询进行报告。
我想从不相关的系统中隔离数据集以进行查询和清除,但我担心性能问题。我有一些想法,但我不清楚哪些是最有可能的。
最容易实现(对于我的代码)将是一个顶级&#34;项目&#34;宾语。那个项目对象将有一些直接的孩子(通过关系)和许多间接的孩子。我担心当我想按项目过滤时,我必须使用关系通配符MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object)
距离,这在查询方面似乎非常昂贵。
我还可以在项目对象和项目中的每个其他对象之间建立直接关系。 MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object)
这对于编写查询应该更容易,但我不知道当我有一个可能有数百万关系的单个对象时会发生什么。
最后,我可以在数据集中的每个对象上设置project-id属性。 MATCH (c:child_object {project-id:"A1B2C3"})
这似乎是一个浪费的解决方案,但我认为在图表数据库模型中可能会有更好的性能。
如果我破坏了样本Cypher查询/ neo4j术语,请道歉。我把这个项目搁置了6个星期,我有点生疏了。
答案 0 :(得分:1)
如果您有一组有限的数据集,则应考虑使用专用标签来指定数据源。在Neo4j的属性图数据模型中,允许节点具有multiple labels。
MATCH (c:child_object:DataSourceA)
标签始终被编入索引,因此性能应优于您的建议1-3。我也认为这是一个更优雅的解决方案 - 但是,如果您不知道前面的数据集的数量,它将变得棘手。在后一种情况下,您可能会使用类似
的内容MATCH (c:child_object)
WHERE 'DataSourceA' IN labels(c)
但这更像是一个“全表扫描”,因此在性能方面,您最好使用方法3并在project-id
上构建索引。