Cypher - 返回1'随机'来自特定关系的节点

时间:2018-02-02 14:22:54

标签: neo4j cypher

尝试构建一个Cypher查询,每个'漫画'返回一个条目。

基本结构如下:

copyOfRange

我想抓住3'随意'漫画并返回每种类型的漫画中的一个媒体。由于漫画可能有100个媒体类型的媒体,它有点关注。我可以将其分解为多个查询,但我相信Cypher可以通过自己的系统实现这一目标。

我的原始代码可以执行所需的操作,但如果有多个相同类型的媒体,则一个漫画可能会多次返回。

原始代码:

(Comic)<-[]-(Media)-[]->(MediaType)

这有时会回归:

MATCH (mt:MediaType{Name: {mediatype} })
<-[:Is_Media_Of]-(m:Media)-[:Is_Media_For]->(w:Webcomic)
WHERE w.ComicID <> toInt({comicid})
AND m.Status = 'Active'
RETURN m.URL as ImgURL, 
w.Name as ComicName, 
rand() as r 
ORDER BY r ASC Limit toInt({count}) ",
["mediatype"=>$AdType,"count"=>$Count,"comicid"=>$ComicID])

我确定它非常直接,我错过了一些东西。非常感谢任何帮助。

布鲁诺的代码:

'comic1' 'img'
'comic2' 'img'
'comic1' 'img2'
'comic3' 'img2'
'comic4' 'img1'
'comic3' 'img5'

布鲁诺的代码结果:

MATCH (mt:MediaType{Name: {mediatype}})
<-[:Is_Media_Of]-(m:Media)-[:Is_Media_For]->
(w:Webcomic) WHERE w.ComicID <> toInt({comicid}) 
AND m.Status = 'Active' 
WITH distinct m, w 
RETURN m.URL as ImgURL, w.Name as ComicName, rand() as r 
ORDER BY r ASC Limit toInt({count})

目前的结果:

enter image description here

通缉结果: enter image description here

1 个答案:

答案 0 :(得分:1)

试一试:

MATCH (mt:MediaType{Name: {mediatype}})<-[:Is_Media_Of]-(m:Media)-[:Is_Media_For]->(w:Webcomic)
WHERE w.ComicID <> toInt({comicid})
AND m.Status = 'Active'
WITH distinct w, mt, collect(m) as ms
RETURN ms[0].URL as ImgURL, w.Name as ComicName, rand() as r
ORDER BY r ASC Limit toInt({count})

我基本上是通过漫画进行分组并将所有媒体收集到一个列表中。然后我将返回列表的第一个元素。