neo4j 用 case 语句计算节点

neo4j count nodes with case statment

我有这个问题:

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

我也在尝试 return 连接到活动的 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`

我正在向示例数据库添加 link- http://console.neo4j.org/r/afozkf

从这个 graphDB 中,我需要获得具有最高开放时间的 facebookAlbum 和连接到活动的 facebookAlbums 的数量。 我也在检查活动的 isOpeningAlbum 道具。如果是 0 就可以,如果是 1 那么 return is_opening_album=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 用于确保相册及时排序。最后的 return 使用 head(collect()) 找到第一张专辑, count 是自我描述的。

如果您有很多相册连接到一个活动,您可能会考虑重构您的图形模型。相册基本上根据创建时间形成一个链表。使用 NEXTPREV 关系,您可以在图中明确显示该结构并大大加快查询速度。