图形DB获得Neo4j cypher中下一个最佳推荐节点

azn*_*t81 5 graph neo4j cypher

我有一个使用NEO4j的图表,目前正在尝试构建一个比基于文本的搜索更好的简单推荐系统.

创建节点,例如:专辑,人物,类型,图表

创建关系,例如:

People - [:role] -> Album 角色是:艺术家,制片人,歌曲作者

Album-[:is_a_type_of]->Type (类型基本上是Pop,Rock,Disco ...)

People -[:POPULAR_ON]->Chart (图表是他们可能的Billboard)

People -[:SIMILAR_TO]->People (预定的相似性连接)

我写了以下密码:

    MATCH (a:Album { id: { id } })-[:is_a_type_of]->(t)<-[:is_a_type_of]-(recommend)    
    WITH recommend, t, a
    MATCH (recommend)<-[:ARTIST_OF]-(p)
    OPTIONAL MATCH (p)-[:POPULAR_ON]->()
    RETURN recommend, count(DISTINCT t) AS type
    ORDER BY type DESC
    LIMIT 25;
Run Code Online (Sandbox Code Playgroud)

然而,如果只有一种类型的音乐连接到它,它很容易重复,因此有相同的邻居.

是否有建议的方式说:

  • 找到我的下一张最佳专辑,该专辑与起始专辑的关联关系最为相似.
  • 关于打破平局情景的任何建议书?现在它是按类型排序(所以如果一张专辑有多种类型的音乐,它的价值更高,但如果每个人都有相同的数字,则没有更重要的意义)
  • - 我使[:SIMILAR_TO]链接强制优先考虑将这种关系视为重要,但我还没有一个有效的密码
  • -Same适合[:Popular_On](也许放弃这种关系?)

Som*_*luk 2

您可以使用 4 种配置,并按照此顺序按价值较高的顺序订购专辑。将配置保持在 0 到 1 之间(例如 0.6)

a. People Popular on Chart and People are similar
b. People Popular on Chart and People are Not similar
c. People Not Popular on Chart and People are similar
d. People Not Popular on Chart and People are Not similar
Run Code Online (Sandbox Code Playgroud)

计算每个专辑的这 4 个值并求和。专辑价值越高,推荐度越高。

我暂时将配置设置为a = 1,b = 0.8,c = 0.6,d = 0.4。并假设存在某种关系,表明某些人喜欢专辑。如果您仅基于图表制作逻辑,则仅使用 a 和 b。

MATCH (me:People)
where id(me) = 123
MATCH (a:Album { id: 456 })-[:is_a_type_of]->(t:Type)<-[:is_a_type_of]-(recommend)    
OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(a:People)-[:POPULAR_ON]->(:Chart)
WHERE exists((me)-[:SIMILAR_TO]->(a))
OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(b:People)-[:POPULAR_ON]->(:Chart)
WHERE NOT exists((me)-[:SIMILAR_TO]->(b))
OPTIONAL MATCH (recommend)<-[:LIKES]-(c:People)
WHERE exists((me)-[:SIMILAR_TO]->(a))
OPTIONAL MATCH (recommend)<-[:LIKES]-(d:People)
WHERE NOT exists((me)-[:SIMILAR_TO]->(a))
RETURN recommend, (count(a)*1 + count(b)*0.8 + count(c)* 0.6+count(d)*0.4) as rec_order
ORDER BY rec_order DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)