【发布时间】:2015-07-15 13:35:25
【问题描述】:
我正在使用 Neo4j 图形数据库,我正在尝试构建一个复杂的密码查询
我有以下节点和关系:
节点:
- 客户节点
- 品牌节点
- Segment 节点(具有“MaxReservationsPerBrandPerMonth”属性)
- 预留节点
关系:
- 每个客户都细分到一个细分市场
- 客户可以与预订有 cust_reserved 关系
- 每个预订都与一个品牌相关
我想获取 客户数量,这些客户有资格为特定品牌进行新预订。
因此,我需要计算给定品牌的每个客户的预订量,并与该客户细分的 MaxReservationsPerBrandPerMonth 进行比较。
请注意,未预订的客户也应计算在内
感谢您的支持。
编辑 1
在尝试迈克尔第一次查询后,查询是:
PROFILE MATCH (c:Customer)
// also count customers without reservations (make this match optional)
OPTIONAL MATCH (c)-[:CUST_RESERVED]->(r:Reservation)-[:RESERVATION_FOR]->(b:brand {BRAND_ID: "3"})
// count reservations by brand and customers
WITH c, b, count(*) as reservations
MATCH (c)-[:SEGMENTED]->(s:segment)
WHERE reservations < s.max_sms_per_month
// aggregate count customers per brand
RETURN b.NAME, count(distinct c) as customers
查询结果:
结果出乎意料,我想获得“本田”品牌的合格客户,结果只有5个(之前已经为本田预留,但仍然合格,因为他们还没有达到最大值),结果应该是 998734(所有客户)
查询资料:Query profile
编辑 2
Michael 的第二个查询在 20 秒左右就发挥了作用,谢谢 Michael 我需要在某些预订期间包含一些日期逻辑来检查预订:)
【问题讨论】:
-
尝试为
:brand(BRAND_ID)创建一个约束/索引(注意你应该将拼写修正为:Brand(brandId) -
当您按品牌名称分组时(正如您所说的“符合品牌条件”,这是我所期望的)。