Neo4j - 查找与特定电影共享大多数标签的电影

时间:2017-05-10 21:25:16

标签: neo4j cypher

我写的这个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

2 个答案:

答案 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