2014-09-30 2 views
0

목표는 노드의 모든 관계를 반복하고 각 관계의 특정 속성 하나를 인쇄하는 것입니다. 내 노드에는 많은 관계가 있습니다 (수십만 개). 내 반복은 반복 루프에서 느리고 느리게 진행됩니다. 누군가 내 코드에 대한 제안이나 의견을 제시 할 수 있습니까? 미리 감사드립니다! 당신이 매일 균형을 플롯하려는 경우Neo4j에서 getProperty()가 느려지고 느려짐

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

+0

내 그래프의 각 관계마다 보내거나받은 비트 동전 수를 나타내는 타임 스탬프가 있습니다. 내가 원하는 것은이 노드의 일일 균형을 계획하는 것입니다. – Neo4jNewBee

답변

0

는 혹시 거기 것을 모든 관계를 검색 할 필요가 없습니다. 특정 일에 거래

합계 : 내가 SENT 당신의 보내기/요청 키와의 관계 유형의 레이블 Address을 가정 한

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 

그것을 내가 아는 모든 것을 그대로 나는 사이퍼에 응답 할 것이다 및 RECEIVE. tsStartOfDay 및 tsEndOfDay는 합계 값을 구하는 날짜의 긴 값 타임 스탬프를 나타내는 쿼리에 전달 된 매개 변수로 가정합니다.

계산이 필요 없도록 각 보내기/받기가 제정되면 노드에 저울을 저장하는 것이 좋습니다. 새로운 트랜잭션이 시스템에 추가 될 때마다 것을이 재산 업데이트 그래서 : 이미 많은 데이터를 모델링 한 경우 누적 합계없이

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

을 당신은 당신의 주소 각 노드에 추가 쿼리를 실행할 수 있습니다 모든 기존 데이터를 기반으로합니다. 그런 다음이 모든 값을 지갑이나 계정의 합계로 통합하여 각 주소 노드의 잔액 속성을 합산 할 수 있다고 가정합니다.

참고 : 배정 밀도 변수에 값을 저장하는 데주의하십시오. 특히 Bitcoin 통화의 분수 특성을 처리 할 때 반올림 오류가 발생할 수 있습니다.

관련 문제