Neo4j Cypher中的图形数据库如何获取下一个最佳推荐节点

5
我使用NEO4j创建了一个图,目前正在尝试构建一个比基于文本搜索更好的简单推荐系统。
创建了节点,如:Album、People、Type、Chart。
创建了关系,如:
People - [:role] -> Album,其中角色为Artist、Producer、Songwriter。
Album-[:is_a_type_of]->Type(类型基本上是Pop、Rock、Disco...)。
People -[:POPULAR_ON]->Chart(Chart是他们可能在哪个Billboard上)。
People -[:SIMILAR_TO]->People(预定的相似连接)。
我已经编写了以下Cypher查询语句:
    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;

它可以工作,但如果它只与一种类型的音乐相连,那么很容易重复自己,因此具有相同的邻居。

有没有建议的方法说:

  • 找到与起始专辑最相似的连接关系最多的下一个最佳专辑。
  • 任何打破平局的建议?现在按类型排序(因此,如果一个专辑有多种类型的音乐,它会被赋予更高的价值,但如果每个专辑都有相同数量的类型,则没有更重要的了)
  • -我创建了[:SIMILAR_TO]链接以强制将该关系视为重要考虑因素,但我还没有使用它的有效cypher
  • -同样适用于[:Popular_On](也许应该放弃这种关系?)
1个回答

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

计算并对每个专辑的这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;

我理解你的逻辑,但是我不明白你所说的配置和计算+总和与图形类型有什么关系。如果需要,请使用伪代码进行详细说明。 - azngunit81
两个问题:1)你所说的Config是什么意思?这是权重吗?2)People并不是指你。People指的是艺术家、制作人、作曲家等(正如我在问题中解释的那样)。 - azngunit81
@azngunit81:1. 是的,有一些权重。如果需要给“a”更多的权重,则将值设置得更高。2. 好的。那么你只能使用“a”和“b”。虽然如果你有一些已登录用户的映射,那么你可以这样做。我希望你明白我的解决方案以及它对于任何推荐都是好的。 - Somnath Muluk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接