嵌入式模式下的java Neo4j慢速密码查询
我有一个巨大的关于作者的图形数据库,它连接到论文,论文连接到包含论文元信息的节点。 我试图选择符合特定模式的作者,因此我在java中执行了以下cypher语句
String query = "MATCH (n:AUTHOR) WHERE n.name =~ '(?i).*jim.*' RETURN n";
db.execute(query);
我得到一个所有“作者”都回来了的结果集。但执行非常缓慢。是不是因为Neo4j将结果写入内存
如果我尝试使用JavaAPI查找节点,速度会快得多。当然,我只能像下面的代码示例那样搜索确切的名称,但与上面的查询一样,它大约快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并没有自动使用索引(name的索引是在线的)。如果我使用特定索引,并执行查询PROFILE MATCH (n:AUTHOR) USING INDEX n:AUTHOR(name) WHERE n.name = 'jim seroka' RETURN n;
,则将使用该索引。通常Neo4j应自动使用正确的索引。是否要设置任何配置
我还再次在嵌入式模式下进行了一些测试,以检查嵌入式模式下查询的性能。我试图用db.findNode(NodeLabel.AUTHOR, "name", "jim seroka");
选择作者“jim seroka”。它是有效的,在我看来,由于执行时间约为0,05秒,所以使用了索引
但是,如果使用特定索引运行与我在接口中执行的和前面提到的相同的查询,则需要大约4,9秒。为什么?我有点无助。数据库是本地的,只有6位作者。连接器速度慢还是连接创建错误?好的,findNode()
只返回一个节点并执行一个完整的结果,但是四秒钟的差异
下面的源代码应该显示如何创建数据库和执行查询
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 楼答案
您的查询使用正则表达式,因此无法使用索引:
Neo4j 2.3引入了索引支持的^{} 字符串运算符,因此此查询将非常高效:
与正则表达式不完全相同,但会有更好的性能