按Cypher查询中的集合中的元素排序

时间:2015-07-30 15:47:57

标签: neo4j cypher

我正在使用Neo4J处理应用程序,而且我在某些查询中遇到排序问题。我有一个促销商店列表,所以每个商店都有一个节点,每个促销都有一个节点。每个商店都可以有多个促销,因此它是一对多的关系。一些促销特色(特色属性=真)所以我希望那些首先出现。我试图构建一个执行以下操作的查询:

  • 返回一个商店列表,其中包含Promotoions作为集合(返回它是理想的分页)
  • 对商店进行排序,使具有最多特色促销的商店首先出现
  • 对集合进行排序,以便首先显示特色促销

到目前为止,我有以下内容:

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很新,所以我们将非常感谢您的帮助。

1 个答案:

答案 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'