[英]Neo4J cypher:recommend products using NOT clause or any
我能夠使用以下代碼在材料和購買它的最終用戶之間創建關系,但現在我想找到最終用戶未使用共同材料購買的材料,並在圖中顯示為推薦引擎。 假設A買了1,2,3個產品,B買了1,3個產品,c有5個,這里我想向B客戶推薦產品2,c沒有產品,因為c和其余的沒有共同的產品推薦
MATCH(f:material),(t:enduser) WHERE NOT (f)-[:BOUGHT]->(t) return f,t
我嘗試使用 Not 子句,但它顯示了所有產品
這是我將如何解決這個問題。
假設下圖(基於您給出的場景):
為用戶 b 推薦材料:
MATCH (user:EndUser{name:'b'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
NOT((user)-[:BOUGHT]->(m))
AND user <> someOtherUser
RETURN m
哪個會得到結果:
同樣,如果我們嘗試使用 USER-C,我們會得到:
MATCH (user:EndUser{name:'c'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
NOT((user)-[:BOUGHT]->(m))
AND user <> someOtherUser
RETURN m
我們得到了預期的空結果:
關於密碼的一些解釋:
(user:EndUser{name:'b'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
部分第一次匹配我們正在嘗試向用戶推薦:Material
並轉到他/她購買的材料,然后對於每種材料,我們試圖找到另一個:EndUser
,他也已經:BOUGHT
了該材料。 然后對於他們中的每一個,我們也通過他們的:BOUGHT
關系,並將我們找到的這些材料稱為m
。
然后NOT((user)-[:BOUGHT]->(m))
試圖確保用戶(我們試圖推薦給)沒有直接購買該項目,並且user <> someOtherUser
部分檢查用戶和另一個:User
我們在處理過程中發現的:User
節點不是相同的節點(例如循環)。
如何在代碼中使用它:
您通常會使用參數作為所需的值(在本例中為name
)。
python中的簡單示例:
. . .
@staticmethod
def _create_recommendation_transaction(tx, name):
result = tx.run(
"""
MATCH (user:EndUser{name: $name })-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
NOT((user)-[:BOUGHT]->(m))
AND user <> someOtherUser
RETURN m
""", name=name)
. . .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.