Java Neo4j密码查询速度极慢(约20分钟)
我有一个程序,可以打开一个嵌入式数据库并在上面运行几个查询。我使用一个ExecutionEngine,并对每个查询重用它。仅仅运行前3个查询,这是最简单的,需要花费时间-好吧,我不知道需要多长时间,因为我在大约1/2小时后停止了它,之后它只完成了2个查询。我曾经遇到过Cypher在这个图表上速度慢的问题,但从来没有这么糟糕。我正在使用API进行一些更复杂的查询,但我更愿意使用Cypher进行这些查询,因为它们非常简单。我还想运行一些其他查询,这些查询基本上需要多次运行并返回大部分数据库、一些节点。。我知道这是不推荐的,但我需要根据它们之间的关系来安排一切——获取图中的每个节点将完全无用。以我现在的速度,这个问题需要几天的时间。我没有其他人认为“慢”(例如500毫秒),B/C这不是一个实时应用,但20分钟是过度的问题。怎么了?我做错了什么 我的数据库包含数百万个节点和至少同样多的关系。Neo4j应该能够轻松处理如此大的图形。为什么我的死刑执行时间如此之长 如果有人能帮我解决这个问题(也许我的问题都错了?),我会非常感激 谢谢, bsg 下面是前三个查询的代码,这三个查询总共需要30分钟以上的时间。它运行每一个并将结果(一个简单的计数)打印到一个文件中Java Neo4j密码查询速度极慢(约20分钟),java,neo4j,cypher,Java,Neo4j,Cypher,我有一个程序,可以打开一个嵌入式数据库并在上面运行几个查询。我使用一个ExecutionEngine,并对每个查询重用它。仅仅运行前3个查询,这是最简单的,需要花费时间-好吧,我不知道需要多长时间,因为我在大约1/2小时后停止了它,之后它只完成了2个查询。我曾经遇到过Cypher在这个图表上速度慢的问题,但从来没有这么糟糕。我正在使用API进行一些更复杂的查询,但我更愿意使用Cypher进行这些查询,因为它们非常简单。我还想运行一些其他查询,这些查询基本上需要多次运行并返回大部分数据库、一些节点
ExecutionEngine eng = new ExecutionEngine(graphdb);
String filepath = resultstring + "basicstats.txt";
PrintWriter basics = new PrintWriter(resultstring + "basicstats.txt");
String querystring = "START user=node:userIndex(\"Username:*\")" +
" WHERE has(user.FullNodeCreationTime) "
+ " RETURN COUNT(user) AS numcrawled";
ExecutionResult result = eng.execute(querystring);
basics.print("Number of users crawled: ");
basics.println(result.iterator().next().get("numcrawled"));
String otherusers = "START user=node:userIndex(\"Username:*\")" +
" WHERE NOT has(user.FullNodeCreationTime)" +
" RETURN COUNT(user) AS numtouched";
result = eng.execute(otherusers);
basics.print("Number of users touched (not crawled): ");
basics.println(result.iterator().next().get("numtouched"));
String partialinfousers = "START user=node:userIndex(\"Username:*\")" +
" WHERE NOT has(user.FullNodeCreationTime) AND NOT has(user.NumFollowers)" +
" RETURN COUNT(user.Username) AS numcrawled";
result = eng.execute(partialinfousers);
basics.print("Number of users with partial info: ");
basics.println(result.iterator().next().get("numcrawled"));
basics.close();
你的数据库有多大?您的
用户索引中有多少用户
您的内存/堆配置是什么?我假设您遇到了很多GC问题,因为Cypher试图将整个db放入内存中以供查询
此外,在冷缓存和内存不足的情况下,您基本上可以测量磁盘速度以将数据拉入内存
您可以将查询合并为一个查询
START user=node:userIndex("Username:*")
RETURN has(user.FullNodeCreationTime),has(user.NumFollowers), COUNT(*) AS num
这将为4个组合返回4个条目,您可以轻松使用/聚合这些条目
所有这些都不是图查询,也不是图全局查询。因此Neo4j和Cypher都没有针对它们进行优化:)首先,使用从shell运行查询以查看查询是如何运行的。这是理解性能问题的第一步
其次,如果我正确理解了您的第一个查询,您只需要知道有多少节点具有FullNodeCreationTime属性。现有查询并没有以最佳方式使用索引,因为您没有寻找特定的值。它还显示为您正在查看单个节点类型,即具有特定标签(例如用户)的节点。如果这是正确的,那么我将在User.FullNodeCreationTime上创建一个索引,并简单地运行以下查询:
match (u:User) where has (u.FullNodeCreationTime) return count(u)
这应该表现得更好 您确定日志记录不是瓶颈吗?删除PrintWriter时的查询次数是多少?每个查询应返回一个值,因此文件仅写入3次。我无法想象这是一个巨大的瓶颈。你使用的是什么版本的Neo4j?您可能需要考虑使用2,这样就可以使用标签。在您的示例中,您可以创建一个用户标签,从而避免使用lucene查询。这将提高您的查询性能。我使用的是1.9,但我现在无法对数据库进行大量修改。这很聪明。谢谢我知道它们并不完全是图形查询(我的图形查询性能更差,因为它们实际上涉及整个图形),但我认为使用和索引应该可以加快速度。。。索引中大约有50万用户,但只有大约5万符合标准。我使用-xmx1024M来运行-我的系统不会让我使用更多。