Neo4j cypher复杂的查询排序,计数,收集前的总和

时间:2014-08-06 21:59:30

标签: sorting neo4j cypher collect

我是neo4j db的新手,刚开始学习它,寻求帮助,因为我被卡住了。是否可以在一个密码查询中获取它?如何?

我的图形结构如下:

(s:Store)-[r:RELEASED]->(m:Movie)<-[r1:ASSIGNED]-(cat:MovieCategorie)

我如何获得这些数据?

  • 电影商店(有)
  • 电影(有)
  • 该商店最常见的5类电影(我不知道如何在使用collect(cat.name)[0..5] 之前对它们进行排序)

任何人都可以建议如何获取这些数据?我尝试了很多次但都失败了,这就是我得到的,但它不起作用。

match (s:Store) 
with s
match (s)-[r:RELEASED]->(m:Movie)
with s,m 
match (m)<-[r1:ASSIGNED]-(cat:MovieCategorie)
with s, m, count(r1) as stylesCount, cat
order by stylesCount
return distinct s as store, collect(cat.name)[0..5] as topCategories
order by store.name

谢谢!


好的,所以当我的查询正确并且我正在进一步开发此查询时,通过组合多个聚合函数COUNT和SUM来解决一些问题。

我的查询可以很好地找到每个商店的前5个类别:

MATCH (s:Store)
OPTIONAL MATCH (s)-[:RELEASED]->(m:Movie)<-[r:ASSIGNED]-(cat:MovieCategorie)
WITH s, COUNT(r) AS count, cat
ORDER BY  count DESC
RETURN c AS Store, COLLECT(distinct cat.name) AS `Top Categories`
ORDER BY Store.name

在此查询之上,我需要计算此商店总和(m.viewsCount)作为总商店视图的数量。我试图像COUNT一样添加到相同的WITH语句中,并尝试将其作为回报,在这两种情况下,我都不会按照我想要的方式工作。有什么建议,例子吗?我仍然很困惑汇聚函数的WITH如何工作...... :(

创建示例数据库

CREATE (s1:Store) SET s1.name = 'Store 1'
CREATE (s2:Store) SET s2.name = 'Store 2'
CREATE (s3:Store) SET s3.name = 'Store 3'

CREATE (m1:Movie) SET m1.title = 'Movie 1', m1.viewsCount = 50
CREATE (m2:Movie) SET m2.title = 'Movie 2', m2.viewsCount = 50
CREATE (m3:Movie) SET m3.title = 'Movie 3', m3.viewsCount = 50
CREATE (m4:Movie) SET m4.title = 'Movie 4', m4.viewsCount = 50
CREATE (m5:Movie) SET m5.title = 'Movie 5', m5.viewsCount = 50

CREATE (c1:MovieCategorie) SET c1.name = 'Cat 1'
CREATE (c2:MovieCategorie) SET c2.name = 'Cat 2'
CREATE (c3:MovieCategorie) SET c3.name = 'Cat 3'

CREATE (m1)<-[:ASSIGNED]-(c1)
CREATE (m1)<-[:ASSIGNED]-(c3)
CREATE (m2)<-[:ASSIGNED]-(c2)
CREATE (m3)<-[:ASSIGNED]-(c1)
CREATE (m3)<-[:ASSIGNED]-(c2)
CREATE (m3)<-[:ASSIGNED]-(c3)
CREATE (m4)<-[:ASSIGNED]-(c1)
CREATE (m4)<-[:ASSIGNED]-(c3)
CREATE (m5)<-[:ASSIGNED]-(c3)

CREATE (s1)-[:RELEASED]->(m1)
CREATE (s1)-[:RELEASED]->(m3)
CREATE (s1)-[:RELEASED]->(m4)
CREATE (s1)-[:RELEASED]->(m5)

CREATE (s2)-[:RELEASED]->(m1)
CREATE (s2)-[:RELEASED]->(m2)
CREATE (s2)-[:RELEASED]->(m3)
CREATE (s2)-[:RELEASED]->(m4)
CREATE (s2)-[:RELEASED]->(m5)

CREATE (s3)-[:RELEASED]->(m1)

解决!!最后我知道了!在一切之后,Trick再次使用了一场比赛,很棒 - 现在我可以安然入睡。谢谢。

MATCH (s:Store)-[:RELEASED]->(m:Movie)<-[r:ASSIGNED]-(cat:MovieCategorie)
with  s,count(r) as catCount,  cat
order by catCount desc
with s, collect( distinct cat.name)[0..5] as TopCategories
match (s)-[:RELEASED]->(m:Movie)
return s as Store, TopCategories, sum(m.viewsCount) as TotalViews

2 个答案:

答案 0 :(得分:3)

好的,那很快:D我终于明白了!

match (s:Store) 
with s
match (s)-[r:PUBLISHED]->(m:Movie)
with s
match (s)<-[r2:ASSIGNED]-(cat:MovieCategorie)
with s, count(r2) as stylesCount, cat
order by stylesCount desc
return distinct s,  collect(distinct cat.name)[0..5] as topCategories
order by s.name

所以技巧首先是count()in,然后按顺序排序,并收集 DISTINCT 作为回报。我不太确定这些多种陈述,会尽力清理它。 ;)

答案 1 :(得分:3)

MATCH (s:Store)-[:RELEASED]->(:Movie)<-[:ASSIGNED]-(cat:MovieCategorie)
WITH s, COUNT(cat) AS count, cat
ORDER BY s.name, count DESC
RETURN s.name AS Store, COLLECT(cat.name)[0..5] AS `Top Categories`

如果你想要每个商店的电影节点中viewsCount属性的总和:

MATCH (s:Store)-[:RELEASED]->(m:Movie)<-[:ASSIGNED]-(cat:MovieCategorie)
WITH s, COUNT(cat) AS count, m, cat
ORDER BY s.name, count DESC
RETURN s.name AS Store, COLLECT(cat.name)[0..5] AS `Top Categories`, SUM(m.viewsCount) AS `Total Views`