Neo4j Cypher查询性能缓慢

5
我尝试了这里提供的示例,经过一些小的修改(主要是添加了一个没有匹配条件的where子句),以进行实验。 在我的系统上(1.9.M04 - java 6u43 - ubuntu 12.04 - AMD phenom II -X6 1090T),这个简单查询只有1个节点在数据库中(也嵌入其中)花费了262毫秒。 显然出现了问题。 可能是什么问题呢?谢谢。
public void test()
    {
        GraphDatabaseService db = g = new GraphDatabaseFactory().newEmbeddedDatabase("./neo4j1test" );

        long id;
        Transaction tx = db.beginTx();
        try
        {
            Node refNode = db.createNode();
            id = refNode.getId();
            refNode.setProperty( "name", "reference node" );
            tx.success();
        }
        finally
        {
            tx.finish();
        }


        ExecutionEngine engine = new ExecutionEngine( db );
        ExecutionResult result = engine.execute( "start n=node("+id+") where ( n.name = \"reference node\") return n.name" );
        long time = System.currentTimeMillis();
        result = engine.execute( "start n=node("+id+") where ( n.name = \"reference node\") return n.name" );
        time = (System.currentTimeMillis() - time);
        System.out.println("Time taken : " + time + " ms.");
    }

也许这只是neo4j引导开销,你应该尝试多次重复查询,在这种情况下,我认为执行时间应该会显著降低。 - remigio
首先,尝试预热缓存。多次运行以下命令:start n=node(*) return count(n);start r=rel(*) return count(r)。其次,如何测量时间?是Cypher输出给出的时间还是特定代码行之前和之后的时间?在第二种情况下,延迟可能存在于您的应用程序和服务器之间。 - ulkas
好的,这是它的行为方式 - 我已经测量了第二个查询执行的时间(期望第一次执行会初始化内部缓存等等)。但是这里有所不同。从第三次执行开始,它需要的时间显著减少。我不知道相同查询的第三次执行有什么特别之处。Remigio感谢提示,ulkas,我正在嵌入式模式下使用它。 - Shilu
1
第三次时,您的数据库缓存已经预热。同时,请确保只执行一次 ExecutionEngine engine = new ExecutionEngine( db );,因为它是可重用且一次性昂贵的操作。 - Peter Neubauer
我认为查询解析(将其转换为某种中间形式 - 例如ast)如果在缓存中找不到,那么时间就会花费在这里。如果这是正确的 - 1)暴露一个查询构建器,用户可以输入随机查询,将面临上述延迟问题,因为查询是随机的,可能不在缓存中。2)如果是这样,第一次执行应该解析查询并将其放入缓存中。然后第二次执行应该更快。但是只有从第三次执行开始才会出现加速效果。我可能完全错了。Peter请给予一些指导。我观察到每个不同的查询从第三次执行开始变得更快。 - Shilu
2个回答

0

你可能想要索引你的名称属性(参见indexing)。之后,你可以像这样查询:

START n=node:your_index_name("name:the_indexed_name") RETURN n;

通过索引查找节点比通过WHERE子句过滤要快得多。


是的,我知道。这个查询只是为了实验目的 - 看看它的行为如何。 - Shilu
嗨@tstorms,我在neo4j上遇到了类似的问题。我创建了一些带有索引的节点,并用关系连接了它们。现在当我尝试获取相互计数时,它执行得非常慢。我的查询几乎花费了2-3秒钟从neo4j中提取大约150条记录。 - Manish Sapkal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接