Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Neo4j密码查询速度极慢(约20分钟)_Java_Neo4j_Cypher - Fatal编程技术网

Java Neo4j密码查询速度极慢(约20分钟)

Java Neo4j密码查询速度极慢(约20分钟),java,neo4j,cypher,Java,Neo4j,Cypher,我有一个程序,可以打开一个嵌入式数据库并在上面运行几个查询。我使用一个ExecutionEngine,并对每个查询重用它。仅仅运行前3个查询,这是最简单的,需要花费时间-好吧,我不知道需要多长时间,因为我在大约1/2小时后停止了它,之后它只完成了2个查询。我曾经遇到过Cypher在这个图表上速度慢的问题,但从来没有这么糟糕。我正在使用API进行一些更复杂的查询,但我更愿意使用Cypher进行这些查询,因为它们非常简单。我还想运行一些其他查询,这些查询基本上需要多次运行并返回大部分数据库、一些节点

我有一个程序,可以打开一个嵌入式数据库并在上面运行几个查询。我使用一个ExecutionEngine,并对每个查询重用它。仅仅运行前3个查询,这是最简单的,需要花费时间-好吧,我不知道需要多长时间,因为我在大约1/2小时后停止了它,之后它只完成了2个查询。我曾经遇到过Cypher在这个图表上速度慢的问题,但从来没有这么糟糕。我正在使用API进行一些更复杂的查询,但我更愿意使用Cypher进行这些查询,因为它们非常简单。我还想运行一些其他查询,这些查询基本上需要多次运行并返回大部分数据库、一些节点。。我知道这是不推荐的,但我需要根据它们之间的关系来安排一切——获取图中的每个节点将完全无用。以我现在的速度,这个问题需要几天的时间。我没有其他人认为“慢”(例如500毫秒),B/C这不是一个实时应用,但20分钟是过度的问题。怎么了?我做错了什么

我的数据库包含数百万个节点和至少同样多的关系。Neo4j应该能够轻松处理如此大的图形。为什么我的死刑执行时间如此之长

如果有人能帮我解决这个问题(也许我的问题都错了?),我会非常感激

谢谢, bsg 下面是前三个查询的代码,这三个查询总共需要30分钟以上的时间。它运行每一个并将结果(一个简单的计数)打印到一个文件中

    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来运行-我的系统不会让我使用更多。