2016-12-03 24 views
0

我在解决Neo4j数据库中的查询时遇到了一些问题。我的数据库存储有关用户,歌曲和专辑的信息。用户可以购买歌曲和专辑,他也可以跟随其他用户。如何使用Cypher在Neo4j中表示此查询

我从“Lisa”用户开始。我想找到购买与Lisa购买的专辑相同风格的专辑的用户,但他们没有跟随Lisa(他们将会是Lisa的推荐用户来关注它们)。

我认为查询会类似于这个,但我找不到正确的sintax来表示它。

MATCH (me:User)-[:BOUGHT]->(a:Album) 
    MATCH (other:User)-[:BOUGHT]->(a2:Album) 
    WHERE NOT (me)-[:FOLLOWS]->(other) AND me.username="Lisa" 
    AND other.username <> "Lisa" AND a.style=a2.style 
    RETURN other.username 

任何帮助? 非常感谢:)

+0

一件事,风格可能工作好,如果建模为自己的节点标签,它可以让您将多种样式应用于相册,并让您在查找相同样式的相册时利用图遍历。 – InverseFalcon

回答

0

您的查询可以正常使用此数据集。我可能会误解某些东西 - 你能进一步指出问题吗?

CREATE 
    (u1:User {username: "Lisa"}), 
    (u2:User {username: "Louis"}), 
    (a1:Album {style: "rock"}), 
    (a2:Album {style: "rock"}), 
    (u1)-[:BOUGHT]->(a1), 
    (u2)-[:BOUGHT]->(a2) 

我加了一些化妆品接触到您的查询:

MATCH (me:User {username: "Lisa"})-[:BOUGHT]->(a1:Album) 
MATCH (other:User)-[:BOUGHT]->(a2:Album) 
WHERE NOT (me)-[:FOLLOWS]->(other) 
    AND other.username <> "Lisa" 
    AND a1.style=a2.style 
RETURN other.username 

结果是:

你可以考虑
╒══════════════╕ 
│other.username│ 
╞══════════════╡ 
│Louis   │ 
└──────────────┘ 
+1

只需要注意,使用'AND其他<> me'会更有效,因为这样可以避免不必要的属性比较。 – InverseFalcon

+0

我犯了一个菜鸟错误。 “样式”字段没有加载在相册上,我的查询没有返回结果。感谢您的答案和提示。我会考虑将这个风格建模为它自己的节点标签:) – david9ppo