getProperty()在Neo4j中变得越来越慢

getProperty()在Neo4j中变得越来越慢,neo4j,Neo4j,我的目标是迭代一个节点的所有关系,并打印出每个关系的一个特定属性。我的节点有很多关系,只有几十万个。我的迭代在迭代循环中越来越慢。有人能对我的代码提出建议或意见吗?提前谢谢你 Node _node = sHelper.getNodeById(id); if (_node != null) { try (Transaction tx = graphDB.beginTx()) { if (_node.hasProperty("PublicKey

我的目标是迭代一个节点的所有关系,并打印出每个关系的一个特定属性。我的节点有很多关系,只有几十万个。我的迭代在迭代循环中越来越慢。有人能对我的代码提出建议或意见吗?提前谢谢你

    Node _node = sHelper.getNodeById(id);
    if (_node != null) {
        try (Transaction tx = graphDB.beginTx()) {
            if (_node.hasProperty("PublicKey")) {
                try {

                    double coin = 0;

                    BufferedWriter writer = new BufferedWriter(new FileWriter("./"+id+"_balance.txt"));

                    //Iterator<Relationship> rels = _node.getRelationships(Direction.INCOMING).iterator();
                    int kk = 0;
                    for(Relationship rel : _node.getRelationships(Direction.INCOMING)){
                        //Relationship rel = rels.next();

                        coin = (double) rel.getProperty("Bitcoin");

                        if((kk++)%10000==0){
                        System.out.println(appr+"\t"+coin);
                        }
                    }
                    kk=0;
                    //rels = _node.getRelationships(Direction.OUTGOING).iterator();
                    for(Relationship rel : _node.getRelationships(Direction.OUTGOING)){
                        //Relationship rel = rels.next();

                        coin = (double) rel.getProperty("Bitcoin");

                        if((kk++)%10000==0){
                        System.out.println(coin);
                        }
                    }

                    writer.flush();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {


            }
            tx.success();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("INVALID NODE ID!");
    }

如果您试图绘制每日余额,那么您不需要检索曾经存在的所有关系。我将用密码回答,因为这是我所知道的全部:

给定日期的交易总额:

MATCH (a:Address) WHERE ID(a) = 12345
MATCH (a)-[s:SENT]->()
WHERE s.timestamp >= tsStartOfDay AND s.timestamp <= tsEndOfDay
WITH a, SUM(s.coin) as sent
MATCH (a)<-[r:RECEIVE]-()
WHERE r.timestamp >= tsStartOfDay AND r.timestamp <= tsEndOfDay
RETURN SUM(r.coin) - sent
如果您已经对大量数据进行了建模,但没有运行总计,则可以运行查询,根据所有现有数据将其添加到每个地址节点中。我假设您将所有这些值合并为一个钱包或帐户的总数,然后您可以对每个地址节点的余额属性求和


注意:在双精度变量中存储值时要小心,特别是在处理比特币的分数性质时,可能会出现舍入错误。

您能告诉我们您想要实现什么吗?我相信traversal API比Cypher更快,但是通过查询,无论是聚合还是分页结果,您都可以很容易地实现所需的功能。对于我的图表中的每个关系,我还有一个时间戳,它表示发送或接收的比特币数量。我想要实现的是绘制这个节点的每日余额。
MATCH (a:Address) WHERE ID(a) = 12345
CREATE a<-[:RECEIVE{coin:0.01}]-(howeverYouModelFromNode)
SET a.balance = a.balance + 0.01