我正在使用Neo4J开发一个应用程序,在一些查询中排序有问题。我有一个有促销活动的商店列表,所以我为每个商店都有一个节点,为每个促销设置一个节点。每家商店都可以有多个促销活动,所以这是一对多的关系。有些促销活动有特色(featured = true),所以我希望它们先出现。我正在构建一个查询,它执行以下操作:
到目前为止,我有以下几点:
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store) WITH p, s, collect(p.featured) as featuredCol WITH p, s, LENGTH(FILTER(i IN featuredCol where i='true')) as featuredCount ORDER BY p.featured DESC, featuredCount DESC RETURN s, collect(p) skip 0 limit 10
首先,我尝试使用WITH子句使用featured创建一个集合。然后,我尝试创建第二个集合,其中功能属性等于true,然后在第二个WITH子句中获得长度。这将正确地将集合与促销进行排序,但不会对商店进行排序。如果我试图在末尾添加另一种类型,就会出现一个错误,因为featuredCount变量不在RETURN子句中。我不希望返回子句中的featuredCount变量,因为它抛出了我的分页。
以下是我的第二个查询:
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store) WITH p, s, collect(p.featured) as featuredCol WITH p, s, LENGTH(FILTER(i IN featuredCol where i='true')) as featuredCount ORDER BY p.featured DESC, featuredCount DESC RETURN s, collect(p) ORDER BY featuredCount skip 0 limit 10
我对Neo4J非常陌生,所以任何帮助都将受到极大的感谢。
发布于 2015-07-30 18:20:49
这个查询(请参阅此控制台)对您有用吗?
MATCH (p:Promotion)-[r:BELONGS_TO_STORE]->(s:Store)
WITH p, s
ORDER BY p.featured DESC
WITH s, COLLECT(p) AS pColl
WITH s, pColl, REDUCE(n = 0, p IN pColl | CASE
WHEN p.featured
THEN n + 1
ELSE n END ) AS featuredCount
ORDER BY featuredCount DESC
RETURN s, pColl
LIMIT 10此查询执行以下步骤:
p的所有s节点聚合到一个pColl集合中。在每个pColl中,特色促销仍然是第一个出现的。pColl中的特色促销数量,并订购商店,以便最具特色促销的商店首先出现。注意:这个查询假设featured有一个布尔值,而不是字符串。(FYI:ORDER BY认为true大于false)。如果此假设不正确,则可以将WHEN子句更改为WHEN p.featured = 'true'。
https://stackoverflow.com/questions/31728433
复制相似问题