【问题标题】:Neo4j cypher for co-favorited plus additional attribute共同收藏的 Neo4j 密码以及附加属性
【发布时间】:2014-07-05 23:26:04
【问题描述】:

我正在学习 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 Reeves 的人,他们还喜欢谁,如果有决胜局,首先显示具有最相关标签的人。通过样本数据,有两个人被同时收藏了基努的用户收藏:Carrie 和 Laurence。 Carrie 和 Keanu 没有重叠的标签,而 Laurence 有两个重叠的标签。我想得到以下结果:

Name        SharedFavCount     OverlapTagCount
Laurence    2                  2
Carrie      2                  0

我尝试了一堆不同组合的不同密码,但都无法破解。

我发现最奇怪的密码 - 我可能还没有完全理解密码 - 这是我明确表示我不希望 Keanu 出现在结果中但可惜他出现在结果中的密码。这是密码和结果。

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

有什么想法可以得到想要的结果吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这里是GraphGist 以交互方式回答您的问题。

    您对 "Keanu Reeves"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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2017-09-25
      • 2018-01-24
      • 1970-01-01
      相关资源
      最近更新 更多