Graph DB在Neo4j cypher中获得下一个最佳推荐节点

Graph DB在Neo4j cypher中获得下一个最佳推荐节点,graph,neo4j,cypher,Graph,Neo4j,Cypher,我有一个使用NEO4j的图表,目前正在尝试构建一个比基于文本的搜索更好的简单推荐系统 创建的节点包括:相册、人物、类型、图表 创建的关系如下所示: People-[:role]->相册 角色:艺术家、制作人、歌曲作者 专辑-[:是一种类型的]->类型(类型基本上是流行、摇滚、迪斯科……) People-[:POPULAR_ON]->图表(图表是他们可能的广告牌) People-[:类似]->People(预先确定的相似性连接) 我写了以下密码: MATCH (a:Album { id:

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

创建的节点包括:相册、人物、类型、图表

创建的关系如下所示:

People-[:role]->相册
角色:艺术家、制作人、歌曲作者

专辑-[:是一种类型的]->类型
(类型基本上是流行、摇滚、迪斯科……)

People-[:POPULAR_ON]->图表
(图表是他们可能的广告牌)

People-[:类似]->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;

MATCH(a:Album{id:{id})-[:is_a_type_of]->(t)您可以使用4种配置,并按照此顺序中较高的值来订购相册。将配置保持在0到1之间(例如0.6)

计算每个相册的这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;
匹配(我:人)
其中id(me)=123
MATCH(a:Album{id:456})-[:is_a_type_of]->(t:type)(a))
可选匹配(推荐)(:图表)
不存在的地方((me)-[:类似于]->(b))
可选匹配(推荐)(a))
可选匹配(推荐)(a))
退货建议(数量(a)*1+数量(b)*0.8+数量(c)*0.6+数量(d)*0.4)作为收款单
按记录顺序说明
限制10;

我理解您的逻辑,但我也不理解您所说的图形类型学中的配置和计算+和是什么意思。如果需要两个问题,请详细说明使用伪密码:1)配置是什么意思。这个重量是多少?2) 人们不是指你。人们指的是艺术家、制作人、作曲家等等……(如我在问题中所解释的)@azngunit81:1。对一些重量。如果“a”需要给出更多的权重,则设置更多的值。2.可以那么您只能使用“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;