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

Neo4j-查找与特定电影共享大多数标签的电影,neo4j,cypher,Neo4j,Cypher,我写的这个Cypher查询是为了找到与“探索者(1985)”共享标签最多的前10部电影,但它没有返回所需的结果。事实上,它运行了很长时间,然后停止,因为没有足够的内存来完成计算 我对Cypher比较陌生。如果有人能提供帮助,我将不胜感激 MATCH (m1:Movie {title:"Explorers (1985)"})-[:HAS_TAG]->(t:Tag)<-[:HAS_TAG]-(m2:Movie) WITH size((m2)-[:HAS_TAG]->(t))

我写的这个Cypher查询是为了找到与“探索者(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
MATCH(m1:Movie{title:“Explorers(1985)”})-[:HAS_TAG]->(t:TAG)(t))作为cnt,
平方米
返回m2,cnt
订购人在描述限制10中

您可以稍微简化您的匹配,因为我们将遍历相同的关系类型两次。至于标记计数,您可以
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

我无法在大型数据集上进行确认,但我认为可以通过将查询分解为以下步骤来最小化加载的节点

// 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