Neo4j性能 - IN运算符Cypher查询

时间:2016-02-27 16:13:48

标签: neo4j

如果我有一百万用户,并且我使用IN运算符搜索超过1000个自定义ID的自定义ID。

例如,在neo4j给出的电影数据库中 让我们说我需要获取所有电影,其中我的演员列表(> 1000)应该在该电影中播放,并按电影发布日期和不同的电影结果排序。

在数据库上执行该操作真的很好,如果我在单节点实例和ha集群中执行该操作,那么时间复杂度是多少。

2 个答案:

答案 0 :(得分:3)

这将为您提供计算中涉及的计算复杂性的粗略指导。

对于每个演员,Neo将查找从该节点开始的所有Acted_In关系。让我们假设每个Actor的平均Acted_In关系数为4。

因此Neo每个Actor需要4次遍历。 因此1000个Actors将会进行4000次遍历。 对于Neo而言并不是很多(他们声称每秒大约做100万,但当然这取决于硬件)

然后,查询的明显方面对于Neo来说是微不足道的,因为它知道它访问了哪些节点,因此Neo会自动拥有唯一的Movie节点列表,因此这将非常快。

如果电影的发行日期在Neo中编入索引,结果的排序也会很快。

因此从理论上讲,此查询应该快速运行(远低于一秒)并且对数据库的影响最小

答案 1 :(得分:0)

以下是我要做的事情,我会从具有最低程度的演员开始遍历,即数据集的最高选择性。然后找到他演的电影,并与其他演员一起检查这些电影。

第二种选择可能是更有效的实施方式。 (还有另一个技巧可以加快这一点,当你有数据集来测试它时,请通过电子邮件告诉我。)

MATCH (n:Actor) WHERE n.id IN {ids}
WITH n, SIZE( (n)-[:ACTED_IN]->() ) as degree
ORDER BY degree ASC 
WITH collect(n) as actors WITH head(actors) as first, tail(actors) as rest, size(actors)-1 as number
// either
MATCH (n)-[:ACTED_IN]->(m)
WHERE size( (m)<-[:ACTED_IN]->() ) > number AND ALL(a in rest WHERE (a)-[:ACTED_IN]->(m))
RETURN m;

// or
MATCH (n)-[:ACTED_IN]->(m)
WHERE size( (m)<-[:ACTED_IN]->() ) > number
MATCH (m)<-[:ACTED_IN]-(a)
WHERE a IN rest
WITH m,count(*) as c, number
WHERE c = number
RETURN m;