【发布时间】:2015-10-12 17:23:51
【问题描述】:
我正在尝试使用 Neo4j 实现一个推荐算法,这与page 上的实现类似。
现在我有一个简单的社交示例,用户可以:
- 关注其他用户
- 玩游戏
- 居住在一个国家
这个想法是根据其他用户是否是朋友的朋友、玩相同的游戏、居住在相同的国家和/或关注相关用户来制定朋友建议算法。
除了后者,使用上面页面中的示例很容易实现,如下所示:
MATCH (origin)-[r1:FOLLOWS|PLAYS|LIVES_IN]-(c)-[r2:FOLLOWS|PLAYS|LIVES_IN]-(candidate)
WHERE type(r1)=type(r2) AND NOT (source)-[:FOLLOWS]->(candidate)
RETURN candidate, SUM(ROUND(r2.weight) AS boost
ORDER BY boost DESC LIMIT 10
但是,一次完成整个事情的唯一可行方法是与另一个查询进行联合并处理结果。大致如下:
THE_QUERY_ABOVE
UNION
MATCH (origin)<-[r:FOLLOWS]-(candidate)
RETURN candidate, r.weight as boost
WITH candidate, boost
RETURN DISTINCT candidate, SUM(boost)
ORDER BY boost DESC LIMIT 10
但据我所知,Cypher 尚无法对UNION 结果进行后处理...
因此,我的问题是:这可能在单个查询中实现吗?以及如何?
如果是,是否有一种可能的解决方案,我不必在关系中指定权重,以避免在我想更改优先级时必须更改所有关系?强>
干杯!
【问题讨论】:
标签: neo4j cypher union social-networking recommendation-engine