Neo4j以嵌入模式

时间:2015-12-21 17:03:24

标签: java performance neo4j cypher neo4j-embedded

我有一个巨大的图形数据库,其中包含作者,它们连接到与包含论文元信息的节点相连的论文和论文。 我试图选择与特定模式匹配的作者,因此我在java中执行了以下cypher语句。

String query = "MATCH (n:AUTHOR) WHERE n.name =~ '(?i).*jim.*' RETURN n";
db.execute(query);

我得到一个带有所有"作者"的结果集。背部。但执行速度很慢。是吗,因为Neo4j将结果写入内存?

如果我尝试使用Java API查找节点,则速度要快得多。当然,我只能搜索确切的名称,如下面的代码示例,但它比上面的查询快4秒。我在一个有大约50个节点的小型数据库上进行了测试,其中只有6个节点是作者。六位作者也在索引中。

db.findNodes(NodeLabel.AUTHOR, NodeProperties.NAME, "jim knopf" );

有没有机会加速密码?或者通过Java API和findNodes()方法获取所有节点的可能性,它们与给定模式匹配?

仅供参考,我使用graph.schema().indexFor(NodeLabel.AUTHOR).on("name").create();

在java中创建了作者姓名的索引

也许有人可以提供帮助。提前谢谢。

修改

我今天进行了一些测试。如果我在浏览器界面中执行查询PROFILE MATCH (n:AUTHOR) WHERE n.name = 'jim seroka' RETURN n;,我只有运算符 NodeByLabelScan 。在我看来,Neo4j不会自动使用索引(索引名称在线)。如果我使用特定索引,并执行查询PROFILE MATCH (n:AUTHOR) USING INDEX n:AUTHOR(name) WHERE n.name = 'jim seroka' RETURN n;,则将使用索引。通常Neo4j应该自动使用正确的索引。是否有任何配置要设置?

我还在嵌入模式下进行了一些测试,以检查嵌入模式下查询的性能。我试图选择作者" jim seroka"与db.findNode(NodeLabel.AUTHOR, "name", "jim seroka");。它起作用,在我看来使用了索引,因为执行时间约为0.05秒。

但是如果我运行相同的查询,就像我在界面中执行并且之前提到的那样,使用特定的索引,则需要大约4,9秒。为什么?我有点无奈。该数据库是本地的,只有6位作者。连接器是慢还是连接错误?好的,findNode()确实只返回一个节点并执行一个完整的结果,但差异为4秒?

以下源代码应显示如何创建数据库并执行查询。

public static GraphDatabaseService getNeo4jDB() {
    ....
    return new GraphDatabaseFactory().newEmbeddedDatabase(STORE_DIR);
}

private Result findAuthorNode(String searchValue) {
    db = getNeo4jDB();

    String query = "MATCH (n:AUTHOR) USING INDEX n:AUTHOR(name) WHERE n.name = 'jim seroka' RETURN n";

    return db.execute(query);
}

1 个答案:

答案 0 :(得分:2)

您的查询使用正则表达式,因此无法使用索引:

MATCH (n:AUTHOR) WHERE n.name =~ '(?i).*jim.*' RETURN n

Neo4j 2.3引入了索引支持的STARTS WITH字符串运算符,因此这个查询非常高效:

MATCH (n:Author) WHERE n.name STARTS WITH 'jim' RETURN n

与正则表达式不完全相同,但性能会更好。