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 MATCH
。 WITH
和 ORDER BY
用于确保相册及时排序。最后的 return 使用 head(collect())
找到第一张专辑, count
是自我描述的。
如果您有很多相册连接到一个活动,您可能会考虑重构您的图形模型。相册基本上根据创建时间形成一个链表。使用 NEXT
或 PREV
关系,您可以在图中明确显示该结构并大大加快查询速度。
我有这个问题:
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 MATCH
。 WITH
和 ORDER BY
用于确保相册及时排序。最后的 return 使用 head(collect())
找到第一张专辑, count
是自我描述的。
如果您有很多相册连接到一个活动,您可能会考虑重构您的图形模型。相册基本上根据创建时间形成一个链表。使用 NEXT
或 PREV
关系,您可以在图中明确显示该结构并大大加快查询速度。