我有一个数据模型,我想在本文Graphgist中发布的文章之后大致建模。
我很好奇我在WHERE子句上可以期待的性能,在这两个节点的给定集合之间有很多关系,每个边缘定义了'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)匹配。
答案 0 :(得分:1)
Neo4j将遍历所有关系并读取属性值。关系属性默认情况下没有索引(这可以使用旧索引实现:检查文档)。
关于性能,请记住Neo4j在遍历关系方面非常快,因此当您的查询“非常昂贵”时,Neo4j可以每秒和每个核心遍历2到4百万个关系,具体取决于您的硬件配置。
因此,总而言之,对于100个关系,它将像闪存一样运行,但目前尚未进行优化,因此如果您需要在1百万个关系上运行相同的操作,您将会看到一些缺点。