我有一个巨大的图形数据库,其中包含作者,它们连接到与包含论文元信息的节点相连的论文和论文。 我试图选择与特定模式匹配的作者,因此我在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();
也许有人可以提供帮助。提前谢谢。
修改
我今天进行了一些测试。如果我在浏览器界面中执行查询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);
}
答案 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
与正则表达式不完全相同,但性能会更好。