2016-07-25 53 views
0

Cypher新手在這裏。使用Neo4j和Cypher標記分組標籤的媒體

我使用下面的代碼製作了此圖的標記的媒體。

Tagged media

CREATE 
(funny:Tag { name: 'Funny' }), 
(sad:Tag { name: 'Sad' }), 
(movie:Tag { name: 'Movie' }), 
(tv:Tag { name: 'TV Show' }), 
(hangover:Media { name: 'The Hangover' }), 
(koth:Media { name: 'King of the Hill' }), 
(simpsons:Media { name: 'The Simpsons' }), 
(twm:Media { name: 'Tuesdays with Morrie' }), 
(mm:Media { name: 'Mary & Max' }), 
(funny)-[:DESCRIBES]->(hangover), 
(funny)-[:DESCRIBES]->(koth), 
(funny)-[:DESCRIBES]->(simpsons), 
(sad)-[:DESCRIBES]->(twm), 
(sad)-[:DESCRIBES]->(mm), 
(movie)-[:DESCRIBES]->(hangover), 
(movie)-[:DESCRIBES]->(twm), 
(movie)-[:DESCRIBES]->(mm), 
(tv)-[:DESCRIBES]->(koth), 
(tv)-[:DESCRIBES]->(simpsons) 

我想做的標籤組一起到環境中,這樣一個上下文節點的含義多個標籤相同。

MATCH 
(tf:Tag { name: 'Funny' }), 
(tr:Tag { name: 'Sad' }), 
(tm:Tag { name: 'Movie' }) 
(tt:Tag { name: 'TV Show' }) 
CREATE 
(fm:Context { name: 'Funny Movies' }), 
(ft:Context { name: 'Funny TV' }), 
(s:Context { name: 'Sad Movies' }), 
(fm)-[:INCLUDES]->(tf), 
(fm)-[:INCLUDES]->(tm), 
(ft)-[:INCLUDES]->(tf), 
(ft)-[:INCLUDES]->(tt), 
(s)-[:INCLUDES]->(tm), 
(s)-[:INCLUDES]->(tr) 

所以現在我們有這個東西。

With Contexts

我想借此上下文節點,並得到媒體,使得這方面的所有標籤描述每個返回的媒體。

我試過MATCH (c:Context { name: 'Funny Movies' })-[:INCLUDES]->()-[:DESCRIBES]->(m) RETURN m以匹配標有FunnyMovies的媒體。預期的輸出僅爲The Hangover,但我獲得了所有媒體。

All media

這是很明顯,我不明白那種查詢我需要寫。我的查詢出了什麼問題,以及如何生成我想要的輸出?

回答

2

當您從上下文開始時,您可以collect該標籤,然後匹配與ALL標籤相關的電影。前一句高亮的詞是關鍵字你作爲Neo4j的文檔中參考:

MATCH (c:Context {name:"Funny Movies"})-[:INCLUDES]->(tag) 
WITH collect(tag) AS tags 
MATCH (m:Media) WHERE ALL(x IN tags WHERE (x)-[:DESCRIBES]->(m)) 
RETURN m 
+0

美麗。謝謝,並接受。我認爲指定恰好一個上下文會將輸出過濾到僅連接到該上下文的頂點。既然它沒有,我最初的查詢究竟做了什麼? –

+1

你的查詢只是模式,translate()到節點和[]到關係,你會發現它有5種模式,以不同的媒體。 –

1

可以使用雙向型態:

MATCH (c:Context { name: 'Funny Movies' })-[:INCLUDES]->()-[:DESCRIBES] 
     ->(m)<- 
     [:DESCRIBES]-()<-[:INCLUDES]-(c) 
RETURN m 
+0

真的很酷!感謝分享。 –