Neo4j - WHERE 子句中边属性查找的性能

Neo4j - Performance of lookups on edge properties in WHERE clause

我有一个数据模型,我想根据这篇 Graphgist 中发布的文章粗略建模。

我很好奇在给定的 2 个节点集与 'from' 和 'to' 在每条边上定义的参数。当您执行这样的匹配查询时,假设有 100 个 SELLS 关系,Neo4J 如何处理根据 WHERE 标准将边缘过滤到重要的边缘的性能:

MATCH (s:Shop{shop_id:1})-[r1:SELLS]->(p:Product)
WHERE (r1.from <= 1391558400000 AND r1.to > 1391558400000)
MATCH (p)-[r2:STATE]->(ps:ProductState)
WHERE (r2.from <= 1391558400000 AND r2.to > 1391558400000)
RETURN p.product_id AS productId,
   ps.name AS product,
   ps.price AS price
ORDER BY price DESC

我还没有找到直接在边缘上索引属性的方法,所以我假设查询优化器可以处理这样的事情,或者它只是遍历边缘数组并找到一个( s) 匹配。

Neo4j 将遍历所有关系并读取 属性 值。默认情况下,关系属性没有索引(这可以通过旧索引实现:查看文档)。

关于性能,请记住 Neo4j 遍历关系的速度非常快,因此当您的查询是 "very expensive" 时,Neo4j 可以每秒和每个内核遍历 2 到 4 百万个关系,具体取决于您的硬件配置。

所以,总而言之,对于 100 个关系,它会 运行 像闪光灯一样,但目前根本没有优化,所以如果你需要 运行 你会看到一些缺点例如,对 100 万个关系进行相同的操作。