教程:构建 Cypher 推荐引擎

图无处不在。通过追踪人物和电影之间有意义的关系,您可以确定演员合作的次数、演员彼此合作的频率以及他们在图中共有的电影。这是我们根据用户以前喜欢的内容和他们最喜欢的演员来推荐电影的一种方式。我们将逐步指导您如何开始使用 AuraDB 和 Cypher® 来解决一个实际问题。

设置

创建 AuraDB 账户后,点击“创建数据库”并选择一个免费数据库。

然后,填写名称,为您的数据库选择一个云区域,并点击“创建数据库”。确保选中“使用电影数据集学习图”,这样您将从一个数据集开始。

AuraDB 会在您的新实例设置过程中提示您密码。请务必保存密码以供后续步骤使用

数据库运行后,按如下所示打开浏览器。

现在您已进入 Neo4j Browser。使用您的用户名和密码(您上面记录的那个)登录。您会立即注意到左侧的指南,您可以浏览这些指南以开始一些实验性查询。通过点击小的“播放”按钮,您可以将您看到的任何查询自动放入查询执行框并在屏幕右侧运行。

第一个查询只显示数据库中的几部电影,以证明那里有数据。恭喜您,您的新数据库中已经有了一些数据,我们准备好开始使用了。

下一节将向您展示如何编写一些查询来探索您刚创建的数据。

基本查询

在我们开始推荐之前,我们需要找出数据中有趣的内容,以了解我们可以和想要推荐哪些类型的东西。首先,我们运行一个像这样的查询来查找一个演员,比如汤姆·汉克斯

MATCH (tom:Person {name: 'Tom Hanks'})
RETURN tom

现在我们找到了感兴趣的演员,我们可以从汤姆·汉克斯节点开始,沿着ACTED_IN关系查找他所有的电影。您的结果应该看起来像一个图。

MATCH (tom:Person {name: 'Tom Hanks'})-[r:ACTED_IN]->(movie:Movie)
RETURN tom, r, movie

当然,汤姆有与他在电影中合作的同事。查找汤姆的合演者语句如下:

MATCH (tom:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor:Person)
RETURN coActor.name

协同过滤推荐

我们现在可以将上面的合演者查询转换为推荐查询,方法是再深入一步,找出“合合演者”,即汤姆网络中的二级演员。这将向我们展示汤姆可能尚未合作过的所有演员,我们可以指定一个条件,以确保他没有直接与该人合作过。

MATCH (tom:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(movie1:Movie)<-[:ACTED_IN]-(coActor:Person)-[:ACTED_IN]->(movie2:Movie)<-[:ACTED_IN]-(coCoActor:Person)
WHERE tom <> coCoActor
AND NOT (tom)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActor)
RETURN coCoActor.name

您可能注意到有几个名字多次出现。这是因为从汤姆·汉克斯到这些演员有多条路径可循。

为了查看哪些“合合演者”在汤姆的网络中出现次数最多,我们可以通过计算汤姆·汉克斯和每个合合演者之间路径的数量,并按从高到低的顺序排列,将出现频率纳入考虑。

MATCH (tom:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(movie1:Movie)<-[:ACTED_IN]-(coActor:Person)-[:ACTED_IN]->(movie2:Movie)<-[:ACTED_IN]-(coCoActor:Person)
WHERE tom <> coCoActor
AND NOT (tom)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActor)
RETURN coCoActor.name, count(coCoActor) as frequency
ORDER BY frequency DESC
LIMIT 5

其中一位“合合演者”是汤姆·克鲁斯。现在让我们看看两位汤姆之间有哪些电影和演员,这样我们就能找出谁可以介绍他们认识。

探索路径

MATCH (tom:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(movie1:Movie)<-[:ACTED_IN]-(coActor:Person)-[:ACTED_IN]->(movie2:Movie)<-[:ACTED_IN]-(cruise:Person {name: 'Tom Cruise'})
WHERE NOT (tom)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(cruise)
RETURN tom, movie1, coActor, movie2, cruise

如您所见,这会返回多条路径。如果您玩过凯文·贝肯的六度分隔游戏,那么这种查看人与人之间有多少跳(hops)的概念正是图所描绘的。您会注意到我们的结果甚至返回了一条包含凯文·贝肯本人的路径。

通过这两个简单的 Cypher 语句,我们已经创建了两种推荐算法——接下来要认识/合作谁以及如何认识他们

其他推荐

您可以将这里学到的相同理念应用于许多其他用途,例如推荐产品和服务、寻找您可能喜欢的餐厅或活动,或者与其他有相似兴趣或技能的同事建立联系。我们在这里会特别提到一些,并提供您可以找到更多信息的资源。

餐厅推荐

我们有一张关于几个朋友及其最喜欢的餐厅、菜系和地点的图。

restaurant recommendation

这里有一个实际问题需要回答,以图搜索的形式表达为:

What Sushi restaurants are in New York that my friends like?

如何将其转化为适当的 Cypher 语句?

MATCH (person:Person {name: 'Philip'})-[:IS_FRIEND_OF]->(friend)-[:LIKES]->(restaurant:Restaurant)-[:LOCATED_IN]->(loc:Location {location: 'New York'}),
      (restaurant)-[:SERVES]->(type:Cuisine {type: 'Sushi'})
RETURN restaurant.name, count(*) AS occurrence
ORDER BY occurrence DESC
LIMIT 5

可以轻松集成到此查询中的其他因素包括收藏、过敏、评分和距当前位置的距离。

© . All rights reserved.