【问题标题】:Neo4j - Performance of lookups on edge properties in WHERE clauseNeo4j - 在 WHERE 子句中查找边缘属性的性能
【发布时间】:2015-09-25 03:32:22
【问题描述】:

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

我很好奇 WHERE 子句的性能,如果给定的 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

我还没有找到直接在边上索引属性的方法,所以我假设查询优化器可以处理这样的事情,或者它只是逐字遍历边数组并找到边那场比赛。

【问题讨论】:

    标签: neo4j cypher edges


    【解决方案1】:

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

    关于性能,请记住,Neo4j 在遍历关系方面非常快,因此虽然您的查询“非常昂贵”,但根据您的硬件配置,Neo4j 每秒和每个内核可以遍历 2 到 4 百万个关系。

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

    【讨论】:

    • 这很有意义。感谢您的回复,我们将按计划继续进行。该属性是一个时间戳,因此索引通常没有意义,但我想知道在遍历时这样做是否有任何重大好处,但听起来可能没有任何收获。感谢您的帮助!
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多