2014-07-05 15 views
2

我正在學習Neo4j並決定採取其中一個示例查詢並添加一個扭曲。我拿這個例子http://docs.neo4j.org/chunked/stable/cypher-cookbook-co-favorited-places.html,並想說如果有一個額外的屬性,你可以用來過濾結果。我把我的測試放在一起就是在圖表中添加標籤,然後我想通過重疊的收藏夾desc進行搜索,然後通過重疊標籤desc進行搜索。Neo4j密碼爲co-favorited加上附加屬性

這裏是我使用的樣本數據:

CREATE (Keanu:Person {name:'Keanu Reeves', born:1964}) 
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967}) 
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961}) 
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960}) 
CREATE (UserBart:User {username:'bart' }) 
CREATE (UserHomer:User {username:'homer' }) 
CREATE (UserMarge:User {username:'marge' }) 
CREATE (Male:Tag {name:'male' }) 
CREATE (Female:Tag {name:'female' }) 
CREATE (BadHair:Tag {name:'badhair' }) 
CREATE 
    (UserBart)-[:FAVORITE]->(Keanu), 
    (UserBart)-[:FAVORITE]->(Laurence), 
    (UserBart)-[:FAVORITE]->(Carrie), 
    (UserHomer)-[:FAVORITE]->(Carrie), 
    (UserHomer)-[:FAVORITE]->(Hugo), 
    (UserMarge)-[:FAVORITE]->(Keanu), 
    (UserMarge)-[:FAVORITE]->(Laurence), 
    (UserMarge)-[:FAVORITE]->(Carrie), 
    (Male)-[:TAGGED]->(Keanu), 
    (Male)-[:TAGGED]->(Laurence), 
    (Male)-[:TAGGED]->(Hugo), 
    (Female)-[:TAGGED]->(Carrie), 
    (BadHair)-[:TAGGED]->(Keanu), 
    (BadHair)-[:TAGGED]->(Laurence) 

我想回答這個問題:所有誰收藏了基努·裏維斯,還有誰擁有它們收藏和人民,如果有一個決勝秀首先有相關標籤最多的人。通過樣本數據,有兩位同樣喜歡Keanu的用戶也喜歡:Carrie和Laurence。 Carrie與Keanu沒有重疊標籤,而Laurence有兩個重疊標籤。我想得到以下結果:

Name  SharedFavCount  OverlapTagCount 
Laurence 2     2 
Carrie  2     0 

我試過了一堆不同的密碼以不同的組合,一直沒能破解它。

我發現最奇怪的密碼 - 我可能還沒有完全理解密碼 - 這是我明確表示我不想在結果中使用基努,但是他出現在結果中。這是密碼和結果。

MATCH (anchor:Person)<-[:FAVORITE]-(u:User)-[:FAVORITE]->(similiar:Person) 
OPTIONAL MATCH (anchor)<-[:TAGGED]-(t:Tag)-[:TAGGED]->(similiar2:Person) 
WHERE anchor.name = 'Keanu Reeves' 
AND similiar.name <> 'Keanu Reeves' 
AND similiar.name = similiar2.name 
return similiar.name, count(DISTINCT u.username), count(DISTINCT t.name) 

,結果爲暗號:

Name    SharedFavCount  OverlapTagCount 
Carrie   3     0 
Hugo    1     0 
Laurence   2     2 
Keanu   2     0 

任何想法如何,我可以得到想要的結果?

回答

3

這是一個GraphGist交互式回答你的問題。

您的WHERE篩選爲「Keanu Reeves」適用於錯誤匹配,將其向上移動到MATCH子句後面。 並添加一個ORDER BY您的tie-break規則。

你也可以簡化你的查詢,你不需要額外的約束,而是重用+類似的+標識符。 Keanu Reeves不能顯示爲+類似+,因爲指向他的+ FAVORITE +關係已在路徑中使用。

MATCH (anchor:Person)<-[:FAVORITE]-(u:User)-[:FAVORITE]->(similiar:Person) 
WHERE anchor.name = 'Keanu Reeves' 
OPTIONAL 
MATCH (anchor)<-[:TAGGED]-(t:Tag)-[:TAGGED]->(similiar) 
RETURN similiar.name, count(DISTINCT u.username) as favs, count(DISTINCT t.name) as tags 
ORDER BY favs DESC, tags DESC 
+0

Michael,謝謝你幫助我學習新東西。 – zgirod