2016-12-03 52 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