2014-09-30 75 views
0

我的目標是迭代節點的所有關係並打印出每個關係的一個特定屬性。我的節點有很多關係(幾十萬)。我的迭代在迭代循環中變得越來越慢。有人可以對我的代碼提出任何建議或意見嗎?先進的謝謝!getProperty()在Neo4j中變得越來越慢

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!"); 
    } 
+0

你能告訴我們你想達到的目標嗎?我相信遍歷API比Cypher更快,但是您可以很容易地通過查詢實現您正在查找的內容,包括聚合或分頁結果。 – JohnMark13 2014-09-30 14:54:08

+0

對於我圖中的每個關係,我也有一個時間戳,表示發送或接收的比特數。我想要實現的是繪製此節點的日常平衡。 – Neo4jNewBee 2014-09-30 15:44:01

回答

0

如果您試圖繪製每日餘額,那麼您不需要檢索所有曾經存在的關係。我會在Cypher支架回答,因爲這是一切,我知道:交易在某一天

總:

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 

我假定標籤AddressSENT您發送/請求鍵和關係類型和RECEIVE。假定tsStartOfDay和tsEndOfDay是傳遞給查詢的參數,它們表示您爲其求和的那一天的長時間值時間戳。

您可能會考慮在每個發送/接收已制定的情況下將餘額存儲在節點上,以便不需要進行計算。因此,每個新的事務被添加到您的系統時間,它更新屬性:

MATCH (a:Address) WHERE ID(a) = 12345 
CREATE a<-[:RECEIVE{coin:0.01}]-(howeverYouModelFromNode) 
SET a.balance = a.balance + 0.01 

如果您已經模擬大量的數據,而不運行總,你可以運行一個查詢,將其添加到您的每個地址的節點基於所有現有數據。我假設您將所有這些值合併爲一個錢包或帳戶的總和,然後您可以將每個地址節點的餘額屬性相加。

注意:小心將值存儲在雙精度變量中,您可能會遇到舍入誤差,特別是在處理比特幣的小數性質時。