难以构建有效的查询

时间:2014-11-05 07:56:08

标签: neo4j cypher

鉴于一个类似于拥有3000名演员和5000部电影的电影数据库的模型,您将如何找到最常见的演员团体一起工作?

我尝试过像

这样的事情
match (a1:Actor)-[:ACTED_IN]-(m:Movie)-[:ACTED_IN]-(a2:Actor)
where a1<>a2
return distinct a1, count(m) as movieCount, a2  limit 999

但这会使服务器达到99%的CPU并且永远不会回来。而且它只会给我配对,而不是组。如果。

我试图长度(收集(m))或收集a2但似乎都没有返回与我的目标相关的东西。

anywho如果你想要刺它,并提供一两个指针,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

要使第一个查询生效,请尝试

MATCH (a1:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(a2:Actor)
WITH a1, a2, COUNT(m) AS c
WHERE c > 1
RETURN DISTINCT a1, a2, c ORDER BY c DESC LIMIT 999

您的WHERE子句不是必需的。

我能想到解决更大问题的最佳方法是创建组节点,然后研究结果。这是一个可以执行此操作的查询。可能需要一段时间。

MATCH (m1:Movie)<-[:ACTED_IN]-(a:Actor)-[:ACTED_IN]->(m2:Movie)
WITH m1, m2, COLLECT(a) AS actors, COLLECT(id(a)) as actorIDs
WHERE LENGTH(actors) > 1
MERGE (g:Group {actors : actorIDs})
    ON CREATE SET g.count = 1
    ON MATCH SET g.count = g.count + 1
WITH g, actors
UNWIND actors AS an
MERGE (g)<-[:PART_OF]-(an)

我在300个演员和500部电影的图表上测试了这一点,每部电影中有10个随机选择的演员。构建组需要48秒。一旦你拥有了这些组,你就可以对参与者的数量,看到该组的次数等进行过滤和/或排序。

我发现actor节点ID的集合总是被排序。如果不是这样,则查询可能无法正常工作,因为现有:组节点上的合并可能不会成功。在这种情况下,您必须在收集它们之前对:Actor节点ID使用ORDER BY。

相关问题