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
关系)。
我的问题并没有那么复杂,但是我找不到答案。
下图显示了我目前的结果。蓝色圆圈是我的起点节点。我想要找到的是红色圆圈中的节点减去蓝色圆圈中的节点! (与起始节点具有最多共同节点的节点)
这是一款根据您的喜好推荐艺术品的应用。根据颜色、类型、艺术家等。
这是我对图片中结果的代码:
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
关系)。