Neo4J Cypher 推荐应用

Neo4J Cypher recomendation app

我的问题并没有那么复杂,但是我找不到答案。

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

这是一款根据您的喜好推荐艺术品的应用。根据颜色、类型、艺术家等。

这是我对图片中结果的代码:

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

希望它是可以理解的,并且有人可以帮助我。

我认为这个查询应该对你有帮助:

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

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

我没有测试这个查询,因为我没有你的数据集。如果你有任何问题,我会编辑它。

向您的问题添加数据集也很棒 :)

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

这应该 return 其他 Art 个节点,按 Art 和 id 8986 的常见颜色数排序。

如果我没弄错,你想 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 使用初始上限,最好不要对 variables (http://nigelsmall.com/zen)

这个查询是否符合您的要求?

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;

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