我有一个检索 1,500 名客户和具有特定 ID 的促销活动的查询。然后,查询会检查这些客户是否没有此促销活动。
我的问题是,这一步查询导致数据库点击次数过多,大约120,000次点击:
WHERE NOT (customers)-[:HAS_PROMOTION]->(promo)
这是查询
PROFILE
MATCH(promo:Promotion{id: "XXXX"})
WHERE promo.end_time > timestamp()
MATCH (c:Customer)
WITH promo, c AS customers SKIP 9000 LIMIT 1500
WHERE NOT (customers)-[:HAS_PROMOTION]->(promo)
RETURN customers.id
我尝试使用exists函数,但没有任何区别 我还反转了关系方向,速度快了 10% 左右
根据您的数据,首先获得所有促销客户,然后返回所有其他客户可能会更有效。例如:
MATCH(promo:Promotion{id: "XXXX"})<-[:HAS_PROMOTION]-(pc:Customer)
WHERE promo.end_time > timestamp()
WITH COLLECT(ID(pc)) AS promotedCustomers
MATCH (c:Customer)
WHERE NOT ID(c) IN promotedCustomers
RETURN c.id