我目前正在 Java 应用程序中使用 Neo4j 数据库,版本 3.0.3,使用 Neo4j jdbc 驱动程序版本 3.0.1(是的,我知道它们不匹配,但我认为现在还可以),并运行查询非常具体。在使用 JDBC 库编写密码查询时,我确保在节点上使用标签并在关系上使用类型。
我的数据集是一个知道其他 Person 节点的 Person 节点网络。KNOWS 关系上有一个日期,以便跟踪该连接的建立时间。我想对两个不同的 Person 节点之间的路径进行一些数据挖掘,如下图所示。随着人们开始认识越来越多的人,我想看看我的端节点是否存在未知关系。这要求我检查开始和结束 Person 之间的路径上的 Person 节点,以及可能创建这些关系的日期。
我运行了一个非常具体的查询,至少我是这么认为的,今天在 neo4j 浏览器功能和我的 Java 代码中,
`MATCH path = (p:Person {name: "garret"})-[:KNOWS*1..6]->(p1:Person {name: "adam"}) return path`
上面的查询一共返回了(garret)和(adam)之间的30条路径。Neo4j 浏览器中该查询的 PROFILE 显示它返回 38 毫秒。所以肯定看起来快如闪电。
使用 StatementResult 对象将该查询连接到我的 Java 代码中并执行查询,我发现当我调用 list() 方法时,如下所示,它的运行时间是42.7 秒!
List<Record> records;
StatementResult r = session.run("MATCH path = (p:Person {name: 'garret'})-[:KNOWS*1..6]->(p1:Person {name: 'adam'}) return path");
records = r.list();
我的问题是这样的:
- 为什么 list() 命令需要这么长时间?
- 处理 Neo4j 结果集的最佳方法是什么?
- 我是否应该从 PROFILE 运行中查看其他有助于确定 .list() 调用是否最终会花费很长时间的东西?
我正处于这个项目的早期阶段,但随着我的数据集的增长,现在获取结果的 42.7 秒肯定会大幅增长。我想从社区那里得到一些建议,什么是最大程度地减少从 StatementResult 检索数据的延迟的最佳方法。
我很感激你们可以提供的所有建议。