java - Neo4j 数据加载性能:驱动程序与自定义程序
问题描述
我正在从 Neo4j Java 自定义过程切换到基于 Neo4j Java 驱动程序的方法。我想最终得到某种运行我的图形算法的微服务,而不是通过 Cypher 调用自定义过程。我使用一堆标准的 HashMap 实现了遍历:一旦将数据从 Neo4j 加载到这些 HashMap 中,图遍历比我原来的自定义过程快得多,所以这是非常有前途的。
现在我的问题是:在自定义过程中,我能够将图形(40 个 mio 边,10 个 mio 节点)加载到哈希图中,如下所示:
@Context
public GraphDatabaseService db;
...
HashMap<Long, Long> mapNodeIdProperty = new HashMap<>();
db.beginTx().getAllNodes().stream().forEach((org.neo4j.graphdb.Node n)
-> mapNodeIdProperty.put(n.getId(),
(Long) n.getProperty("combProp")));
这大约需要一分钟,我认为这是可以接受的服务启动时间。
现在,我可以找到使用驱动程序的最佳解决方案如下:
driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) );
...
try ( Session session = driver.session() )
{
String status = session.writeTransaction( new TransactionWork<String>()
{
@Override
public String execute( Transaction tx )
{
Stream<Record> resultStream = (Stream<Record>) tx.run(
"MATCH (n) RETURN n").stream();
resultStream.forEach((Record n) -> listNodes.add(((Record) n).get("n").asNode()));
return "ok; length=" + listNodes.size();
}
});
System.out.println( status);
}
这需要太多时间,即使我使用密码查询将返回的节点数限制在几千个。我从来没有等待完整的图表加载。
与存储过程相比,使用驱动程序(或替代方法)获得相同速度的最佳选择是什么?是否存在会抑制这一点的基本限制?
解决方案
请记住,过程代码在服务器本身上执行,它有效地嵌入到 Neo4j 中。
将其与通过网络传输所有节点及其属性的需要进行比较。这是过程不需要的大量额外 I/O。
推荐阅读
- lazy-evaluation - WebAssembly 中的惰性求值
- html - 如何从 html css 创建一个禁止图标?
- javascript - Django 在引导模式中提交表单
- javascript - javascript 时间间隔越来越长
- android - 在 MaterialCardView 中获取圆角
- python - 如何在服务器端使用 python 套接字捕获 SSL/TLS 密钥
- .net - MSChart 控件标签
- python - 从 AWS EMR 中的 Scala 代码调用 s3(zip) 中存在的 python(pyspark) 文件
- cdn - 请坚持使用 Cloudflare 工作人员批量来源代理
- linux - Linux | 应该成为root用户的授权管理