【问题标题】:Neo4j - Counting rows with where conditionNeo4j - 使用 where 条件计算行数
【发布时间】:2021-12-24 14:59:45
【问题描述】:

我正在尝试计算 Neo4j 将返回的行数,但计数(或查询)非常慢。

版本 1(70 秒):

MATCH (person:Person)-[:HAS_ORDER]->(order:Order)
WHERE order.timestamp >= 1632434400 AND size((order)<-[:HAS_ORDER]-(:OrderLine)-[:HAS_PRODUCT]->(:Product)) <= 20
WITH order
MATCH (order)<-[:HAS_ORDER]-(:OrderLine)-[:HAS_PRODUCT]->(product:Product)
RETURN COUNT(product);

第 2 版(68 秒):

MATCH (person:Person)-[:HAS_ORDER]->(order:Order)
WITH size((order)<-[:HAS_ORDER]-(:OrderLine)-[:HAS_PRODUCT]->(:Product)) AS amount
WHERE order.timestamp >= 1632434400 AND amount <= 20
RETURN SUM(amount)

使用 Neo4j 4.4 社区,大约有 800000 个订单和大约 17000000 个订单行。

有没有更有效的方法来计算行数?

这些是索引:

CREATE INDEX idx_order_torder_id FOR (n:Order) ON (n.order_id);
CREATE INDEX idx_order_timestamp FOR (n:Order) ON (n.timestamp);
CREATE INDEX idx_person_person_id FOR (n:Person) ON (n.person_id);
CREATE INDEX idx_product_product_id FOR (n:Product) ON (n.product_id);

行数等于4269011。

解释计划:

【问题讨论】:

  • 你有索引吗?你能分享一下 Neo4j 在 :schema 之后重新运行的内容吗?

标签: neo4j count cypher relationship rows


【解决方案1】:

请在下面尝试,希望它会更快得到结果

MATCH (person:Person)-[:HAS_ORDER]->(order:Order)
WHERE order.timestamp >= 1632434400 
WITH order.order_id AS orderid
MATCH (o:Order { order_id: orderid })<-[:HAS_ORDER]-(:OrderLine)-[:HAS_PRODUCT]->(product:Product)
WITH COUNT(product) as productCount
WHERE productCount <= 20
RETURN productCount;

【讨论】:

    【解决方案2】:

    因为每个订单行都有一个产品,所以我可以跳过对产品关系订单行的计数:

    MATCH (order:Order) 
    WHERE order.timestamp >= 1632434400 
    WITH order 
    MATCH (order)<-[:HAS_ORDER]-(orderLine:OrderLine) 
    WITH COUNT(orderLine) as productCount 
    WHERE productCount <= 20 
    RETURN SUM(productCount);
    

    这个查询耗时 0m17.342s

    但我设法通过以下查询窥探了几秒钟:

    MATCH (order:Order) 
    WHERE order.timestamp >= 1632434400
    WITH order, size((order)<-[:HAS_ORDER]-(:OrderLine)) AS amount 
    WHERE amount <= 20 
    RETURN SUM(amount);
    

    这个查询耗时 0m15.675s

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多