首页 > 解决方案 > 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);
}

这需要太多时间,即使我使用密码查询将返回的节点数限制在几千个。我从来没有等待完整的图表加载。

与存储过程相比,使用驱动程序(或替代方法)获得相同速度的最佳选择是什么?是否存在会抑制这一点的基本限制?

标签: javaperformanceneo4j

解决方案


请记住,过程代码在服务器本身上执行,它有效地嵌入到 Neo4j 中。

将其与通过网络传输所有节点及其属性的需要进行比较。这是过程不需要的大量额外 I/O。


推荐阅读