[Neo4j] - Rijen tellen met voorwaarde

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 03-10 22:36
Ik probeer het aantal rijen te tellen dat Neo4j zal retourneren, maar de count (of de query) is erg traag.

Versie 1 (70 sec):

code:
1
2
3
4
5
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);


Versie 2 (68 sec.):

code:
1
2
3
4
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)


Gebruikmakend van Neo4j 4.4 met ongeveer 800000 orders en ongeveer 17000000 orderregels. Als resultaat komt hier 4269011 rijen uit. Is er een efficiëntere manier om de rijen te tellen? :)

Dit zijn de indexes:
code:
1
2
3
4
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);


Hier is de EXPLAIN:
Afbeeldingslocatie: https://tweakers.net/i/8kr-W7mPZUOEYD42x2Rs3XSsm1k=/x800/filters:strip_exif()/f/image/CNHsReVTAmkjVTwfIqr0Zy3v.png?f=fotoalbum_large

[ Voor 30% gewijzigd door ZeroXT op 24-12-2021 17:53 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 03-10 22:36
Omdat elke order line precies 1 product heeft, hoefde ik deze relatie niet te tellen:

code:
1
2
3
4
5
6
7
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);


Deze query deed er 0m17.342s over

Maar ik heb er nog een aantal seconden vanaf kunnen halen met de volgende query:

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


Deze query deed er 0m15.675s over