Neo4J Cypher推荐应用

时间:2015-10-28 14:15:25

标签: neo4j cypher recommendation-engine

我的问题并不复杂,但我找不到答案。

下图显示了我到目前为止的结果。蓝色圆圈是我的出发点。我想要找到的是红色圆圈中的节点减去蓝色圆圈中的节点! (具有与起始节点共同的最多节点的节点)

enter image description here

这是一款根据您喜欢的内容推荐艺术品的应用程序。基于颜色,类型,艺术家等。

以下是我在图片中的结果代码:

START Art=node(8986)
MATCH P=(Art)-[r:HAS_COLOR]->(Color)<-[:HAS_COLOR]-(Art1)
RETURN P, count(DISTINCT P) as Rel
ORDER BY Rel DESC

希望这是可以理解的,有人可以帮助我。

4 个答案:

答案 0 :(得分:1)

如果我做对了,你想要MATCH所有其他艺术品与你的起点共享颜色(至少一个)。对于推荐,您希望按共享颜色的数量对它们进行排序。

此查询应该满足您的需求:

// start as you did before
START art1=node(8986)
// MATCH art1 to other art pieces via similar_color
MATCH (art1)-[:HAS_COLOR]->(similar_color:Color)<-[:HAS_COLOR]-(art2) 
// only if art1 is not the same as art2
WHERE art1 <> art2
// return art2 and the number of similar colors
RETURN DISTINCT art2, count(DISTINCT similar_color) AS num_sc
// order by simiar colors
ORDER BY num_sc DESC

一些注意事项:

  • 节点的id可以更改(例如,删除节点后id将被重复使用),您可能需要考虑将START替换为MATCH
  • 我总是使用标签来匹配节点(即art2:Artpiece
  • Cypher查询的惯例是使用Labels的初始上限,而不是variableshttp://nigelsmall.com/zen

答案 1 :(得分:0)

我认为此查询可以帮助您:

START Art=node(8986)
MATCH (Art)-[:HAS_COLOR]->()<-[:HAS_COLOR]-(Art1)
WHERE id(Art1) != id(Art)
RETURN Art1

我匹配与Art具有相同颜色的每个节点,并且WHERE给定节点不是Art

我没有测试此查询,因为我没有您的数据集。如果您遇到任何问题,我会对其进行编辑。

在您的问题中添加数据集也可能非常棒:)

答案 2 :(得分:0)

MATCH (art:Art) WHERE id(art)=8986
MATCH (art)-[:HAS_COLOR]->(c:Color)
MATCH (c)<-[r:HAS_COLOR]-(rec:Art)
WHERE NOT art=rec
WITH rec, count(r) AS num
RETURN rec, num ORDER BY num DESC

这应返回其他Art个节点,按照Art的常用颜色数量排序,ID为8986.

答案 3 :(得分:0)

此查询是否符合您的要求?

START art=node(8986)
MATCH (art)-[r:HAS_COLOR]->(c:Color)
MATCH p=(c)<-[:HAS_COLOR]-(art1)
WHERE art1 <> art
RETURN p, count(DISTINCT p) as rel
ORDER BY rel DESC;

除了art节点(及其所有HAS_COLOR关系)之外,它应该返回相同的结果。