我写的这个Cypher查询找到了与“Explorers(1985)”共享最多标签数量的前10部电影并没有返回所需的结果。事实上,它运行了很长时间然后停止,因为没有足够的内存来完成计算。
我对Cypher比较陌生。我很感激有人可以提供任何帮助。
MATCH (m1:Movie {title:"Explorers (1985)"})-[:HAS_TAG]->(t:Tag)<-[:HAS_TAG]-(m2:Movie)
WITH size((m2)-[:HAS_TAG]->(t)) as cnt,
m2
RETURN m2, cnt
ORDER BY in DESC LIMIT 10
答案 0 :(得分:0)
您可以稍微简化一下匹配,因为我们两次遍历相同的关系类型。至于标记计数,您可以count(t)
,或只计算结果中出现的m2
次,因为每个标记都有一行共同的行。
试试这个:
MATCH (:Movie {title:"Explorers (1985)"})-[:HAS_TAG*2]-(m2:Movie)
WITH m2, count(m2) as cnt
RETURN m2, cnt
ORDER BY cnt DESC LIMIT 10
答案 1 :(得分:0)
我无法在大型数据集上进行确认,但我认为您可以通过将查询分解为这样的步骤来最小化加载的节点...
// Get tags on base movie
MATCH (m1:Movie {title:"Explorers (1985)"})-[:HAS_TAG]->(t:Tag)
// Reduce tags to 1 row
WITH m1, COLLECT(id(t)) as tags
// Find only valid Movie-HAS->Tag
MATCH (m2:Movie)-[:HAS_TAG]->(t:Tag)
WHERE id(t) in tags AND NOT m2.title = "Explorers (1985)"
RETURN m2, COUNT(t) as cnt
ORDER BY cnt DESC LIMIT 10