我正在使用Neo4J处理应用程序,而且我在某些查询中遇到排序问题。我有一个促销商店列表,所以每个商店都有一个节点,每个促销都有一个节点。每个商店都可以有多个促销,因此它是一对多的关系。一些促销特色(特色属性=真)所以我希望那些首先出现。我试图构建一个执行以下操作的查询:
到目前为止,我有以下内容:
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子句使用feature属性创建一个集合。然后,我尝试创建第二个集合,其中特性属性等于true,然后在第二个WITH子句中获取长度。这会正确地对促销进行排序,但不会对商店进行排序。如果我尝试在最后添加另一种类型,我会收到错误,因为featuresCount变量不在RETURN子句中。我不想在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很新,所以我们将非常感谢您的帮助。
答案 0 :(得分:2)
此查询(see this console)是否适合您?
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
具有布尔值,而不是字符串。 (仅供参考:ORDER BY
认为true
大于false
)。如果此假设不正确,您可以将WHEN
子句更改为WHEN p.featured = 'true'
。