Neo4j 优化密码查询

Neo4j 优化密码查询,neo4j,cypher,Neo4j,Cypher,如何优化此密码查询?它比使用Gremlin的类似查询慢3-4倍 START movie=node:vertices(movieId="100") MATCH genera1<--movie<--()-[ratedRel:rated]->anotherMovie-->genera1 WHERE ratedRel.stars > 3 RETURN anotherMovie.title as title, anotherMovie.movieId as id, g

如何优化此密码查询?它比使用Gremlin的类似查询慢3-4倍

START movie=node:vertices(movieId="100") 
MATCH genera1<--movie<--()-[ratedRel:rated]->anotherMovie-->genera1 
WHERE ratedRel.stars > 3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, 
genera1.genera as genera, 
COUNT(anotherMovie) as count ORDER BY count(anotherMovie) DESC LIMIT 20;
START movie=节点:顶点(movieId=“100”)
匹配genera1 genera1
其中ratedRel.stars>3
返回anotherMovie.title作为title,anotherMovie.movieId作为id,
属作为属,
计数(anotherMovie)作为计数顺序,按计数(anotherMovie)说明限制20;
我只是想检索那些被评为3颗星以上的电影,它们与开始节点具有相同的类别:

我在控制台中运行查询,并使用Neo4j 1.9

小精灵查询:

m = [:];
x = [] as Set;
v = g.v(node_id);

v.out('hasGenera').aggregate(x).back(2).inE('rated').
filter{it.getProperty('stars') > 3}.outV.outE('rated').
filter{it.getProperty('stars') > 3}.
inV.filter{it != v}.
filter{it.out('hasGenera').toSet().equals(x)}.
groupCount(m){\"${it.id}:${it.title.replaceAll(',',' ')}\"}.iterate();

m.sort{a,b -> b.value <=> a.value}[0..24];
m=[:];
x=[]设定值;
v=g.v(节点id);
v、 外('HasGeneras')。骨料(x)。背面(2)。内('rated')。
筛选器{it.getProperty('stars')>3}.outV.outE('rated')。
筛选器{it.getProperty('stars')>3}。
inV.filter{it!=v}。
过滤器{it.out('hasGeneras').toSet().equals(x)}。
groupCount(m){\“${it.id}:${it.title.replaceAll(',','')}\\}.iterate();
m、 排序{a,b->b.value a.value}[0..24];
开始电影=节点:顶点(movieId=“100”)

MATCH movie-->genera1genera1pleae粘贴gremlin查询,Too您可以尝试使用Neo4j 1.9.M02进行查询,看看它是否仍然较慢?数据集是否与Marko在其示例中使用的数据集相同?是的,它是相同的数据集,我尝试使用M02。它还是比较慢。你能删除distinct吗,反正你也不需要它。是的,它可以工作,但仍然比Gremlin慢近3倍。我想Gremlin在某种程度上更有效,因为您精确地指定了什么以及如何执行它。这在非常结构化的查询中是正常的,因为在Gremlin中,您可以自由地精确地描述遍历算法,而在cypher中,引擎试图找到最佳遍历本身。然而,我不能说你的问题是否会是这种情况,因为我不与gremlin合作。您是否曾经尝试过连续多次运行密码查询以使缓存完全打开?并将最佳时间与gremlin缓存系列运行的最佳时间进行比较……如果我多次运行该查询,那么gremlin查询(3s)的性能将完全优于Cypher查询(19s),谢谢。运行这样的查询后出现异常:“Developer:Andres声明:聚合不应该这样使用”。顺便说一句,我现在运行的是Neo4j 1.8.1,因为这是Heroku上可用的版本。一行中使用的
count()
sum()
聚合函数可能有点问题。尝试以某种方式更新查询或破解该行。因为我没有你的用例,所以我用硬方法写了这个查询,但没有实际检查。
START movie=node:vertices(movieId="100") 
MATCH movie-->genera1<-anotherMovie<-[ratedRel:rated]-user
WHERE ratedRel.stars > 3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, genera1.genera as genera, 
COUNT(ratedRel) as cnt ORDER BY cnt DESC LIMIT 20;
START movie=node:vertices(movieId="100") 
MATCH movie-[:hasGenera]->genera1<-[:hasGenera]-anotherMovie<-[ratedRel:rated]-user
WITH anotherMovie,count(ratedRel) as allVotes, sum(ratedRel) as allStars,genera1
WHERE allStars/allVotes>3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, genera1.genera as genera, 
allStars ORDER BY allStars DESC LIMIT 20;