我正在学习Neo4j,并决定采用其中一个示例查询并添加一个扭曲。我采用了这个示例http://docs.neo4j.org/chunked/stable/cypher-cookbook-co-favorited-places.html,并想说明如果有一个额外的属性可以用来过滤结果。我放在一起的测试是在图表中也有标签,然后我想通过重叠的收藏夹desc然后通过重叠标签desc进行搜索。
以下是我使用的示例数据:
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与Keanu没有重叠标签,而Laurence有两个重叠标签。我想得到以下结果:
Name SharedFavCount OverlapTagCount
Laurence 2 2
Carrie 2 0
我尝试了一堆不同组合的不同密码并且无法破解它。
我发现奇怪的密码 - 我可能还没有完全理解密码 - 这是我明确表示我不希望Keanu在结果中但是他出现在结果中的那个。这是cypher以及结果。
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
任何想法如何才能获得理想的结果?
答案 0 :(得分:3)
以下是GraphGist以交互方式回答您的问题。
您对&#34; Keanu Reeves&#34; 的WHERE
过滤适用于错误的匹配,将其向上移动到MATCH
子句后面。
并为您的抢七规则添加ORDER BY
。
您还可以简化查询,不需要额外的约束,而是重复使用+ similiar +标识符。 基努·里维斯不能显示为+ similiar +,因为指向他的+ 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