neo4j用case语句计算节点

时间:2015-01-28 08:57:08

标签: neo4j cypher

我有这个问题:

match (campaign:Campaign)<-[:CREATED_FOR]-(facebookAlbum:FacebookAlbum)
where campaign.id="54b509ec851dd"  
return case when campaign.isOpeningAlbum=0 then facebookAlbum 
when campaign.isOpeningAlbum=1 then 1 end as result
ORDER BY facebookAlbum.openTime DESC LIMIT 1

我正在尝试返回与广告系列相关的facebookAlbums数量,我尝试这样的事情:

match (campaign:Campaign)<-[:CREATED_FOR]-(facebookAlbum:FacebookAlbum) 
where campaign.id="54b509ec851dd" 
 return case when campaign.isOpeningAlbum=0 then facebookAlbum 
when campaign.isOpeningAlbum=1 then 1 end as   result,count(facebookAlbum) as count 
ORDER BY facebookAlbum.openTime DESC LIMIT 1

但它给了我以下错误:

Unknown identifier `facebookAlbum`

我正在添加一个示例db- http://console.neo4j.org/r/afozkf

的链接

从这个graphDB中,我需要获得具有最高openTime和facebookAlbums连接到该广告系列的facebookAlbum。 我正在检查该活动的isOpeningAlbum道具。如果它是0 ok,如果它是1则返回is_opening_album = 1

1 个答案:

答案 0 :(得分:1)

这里的问题似乎是你在同一个声明中使用聚合count(facebookAlbum)(第2次)和未聚合的facebookAlbum(第1次和按顺序) - 这似乎混淆了Cypher(以及我自己)。

基于精炼问题的附录

尝试以下方法:

MATCH (campaign:Campaign { id:'123' })
OPTIONAL MATCH (campaign)-[:CREATED_FOR]->(facebookAlbum)
WITH campaign, facebookAlbum
ORDER BY facebookAlbum.openTime DESC 
RETURN campaign.id, campaign.isOpeningAlbum = 1 AS opening, 
       head(collect(facebookAlbum)) AS firstAlbum, 
       count(facebookAlbum) AS count

此声明假定有些广告系列没有任何相册 - 因此使用OPTIONAL MATCHWITHORDER BY用于确保相册按时完成。最终报表使用head(collect())查找第一张专辑,count自我描述。

如果您有大量相册与广告系列相关联,您可以考虑重构图表模型。相册基本上根据创建时间形成链接列表。使用NEXTPREV关系,您可以在图表中明确显示该结构,并加快查询速度。

相关问题