2014-07-05 11 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