2017-03-15 1 views
0

내 프로젝트에서 레이블 SubjectsAttributes 사이의 관계를 만들려고합니다.병합 관계가 항상 작동하지 않습니다 (지연)

MATCH (a:Attribute { aid: {params}.aid }) 
WITH a 
MATCH (s:Subject { sid: {params}.sid }) 
WITH a, s 
MERGE (s)-[w:WEIGHTED {wid: {params}.wid }]->(a) 
SET w = {params} 

문제가 I이 실행되면 모든 관계가 형성되지 있다는 점이다

I는 다음과 같이 그들의 대응 관계 설정. 게다가, 제 경우에는 52 개의 관계가 있어야하지만, 처음에 나는 어딘가에 만 39 점에 달합니다. 함수를 다시 호출하면 52 개의 관계가 모두 정리됩니다.

enter image description here

왜 이런 일이 무엇입니까?

일부 배경 정보 :

  • 이전의 관계 설정에, 나는 노드 주제를 생성하고 첫 번째 속성 않습니다. 그러나, 나는이 작업으로 neo4j 서버가 (약속을 사용하여) 해결 된 후에 만 ​​실제 관계를 생성하는 것으로 진행한다. 나는. 주제와 속성은 이미 데이터베이스에 채워져 있어야합니다.

  • GrapheneDB를 사용하여 내 neo4j 서버를 호스팅합니다.

  • 내가 여러 개의 동적 매개 변수 (ID)를 가지고 있으므로 작업을 분리하는 이유 때문에 레이블을 만든 다음 관계를 만듭니다.

하지만 관계를 만들기 위해 쿼리를 작성하기 전에 지연이있을 수 있습니까?

아니면 다른 것이 있습니까?

어떻게 해결할 수 있습니까?

HELP!


약속

매우 generaly 말씀이 내가 Queries 사이퍼 스크립트 (가 올바른지) 및 해당 매개 변수 Params와 배열에 대한 약속을 적용하는 방법입니다.

질의 1 :

function querySubjects() { 
      var QueriesAll = []; // array of strings 
      var ParamsAll = []; // array of objects 

      for (var i=0; i<sidArray.length; i++) { 

       // [subjects] 
       var sid   = sidArray[i]; 
       var sparams  = {}; 
       sparams['sid'] = sid; 

       // merge subjects 
       var queryStr = " \ 
       MERGE (s:Subject { sid: {sparams}.sid }) \ 
       SET s = {sparams} \ 
       "; 

       // [+] 
       QueriesAll.push(queryStr); 
       ParamsAll.push({ 
        sparams: sparams 
       }); 

      } // end s++ 

      // --> loop queries 
      loopQueries(QueriesAll, ParamsAll).then(
       function(success){ 
        // --> 
        queryAttributes(); 
       }, 
       function(error){ 
        // ... 
       } 
      ); 
    } 

쿼리 2 주제 : 무게 (문제는 여기서 발생)

function queryWeights() { 

     var QueriesAll = []; // array of strings 
     var ParamsAll = []; // array of objects 

     for (var i=0; i<sidArray.length; i++) { 

      // [subjects] 
      var sid   = sidArray[i]; 
      var sparams  = {}; 
      sparams['sid'] = sid; 

      // [attributes] 
      var attributes   = subjects[sid]; 
      var attributesArray  = Object.keys(attributes); 

      for (var j=0; j<attributesArray.length; j++) { 

       // ... 
       var aid       = attributesArray[j]; 
       var aweight      = attributes[aid]; 

       var aparams      = {}; 
       var wparams      = {}; 

       // [weights] 
       aparams['aid']   = aid; 
       wparams['wid']   = sid + '-' + aid; 
       wparams['aweight']  = aweight; 

       // merge relationship subject-->attribute 
       var queryStr = " \ 
        MATCH (a:Attribute{ aid: {aparams}.aid }) \ 
        WITH a \ 
        MATCH (s:Subject { sid: {sparams}.sid }) \ 
        WITH a, s \ 
        MERGE (s)-[w:WEIGHTED {wid: {wparams}.wid }]->(a) \ 
        SET w = {wparams} \ 
        RETURN a,s \ 
        "; 


       // [+] 
       QueriesAll.push(queryStr); 
       ParamsAll.push({ 
        sparams: sparams, 
        aparams: aparams, 
        wparams: wparams 
       }); 


      } // end a++ 
     } // end s++ 


     // --> loop queries 
     loopQueries(QueriesAll, ParamsAll).then(
      function(success){ 
       // <-- 
       console.log('success') 
      }, 
      function(error){ 
       // ... 
      } 
     ); 

    } 
:

function queryAttributes() { 

     var QueriesAll = []; // array of strings 
     var ParamsAll = []; // array of objects 

     // ----------------------------------------------------------------- 
     // init attributes 
     var aidArray = []; 

     for (var i=0; i<sidArray.length; i++) { 

      var sid    = sidArray[i]; // array of keys 
      var attributes  = subjects[sid]; // object of attributes 
      var attributesArray = Object.keys(attributes); 

      for (var j=0; j<attributesArray.length; j++) { 
       var aid = attributesArray[j]; 
       aidArray.push(aid); 
      } // end a++ 

     } // end s++ 

     // filter out duplicates (works fine) 
     aidArray  = aidArray.filter(onlyUnique); 

     // ----------------------------------------------------------------- 
     // create queries 

     for (var j=0; j<aidArray.length; j++) { 

      // [attributes] 
      var aparams    = {}; 
      aparams['aid']   = aidArray[j]; 

      // merge attribute 
      var queryStr = " \ 
      MERGE (a:Attribute { aid: {aparams}.aid }) \ 
      SET a = {aparams} \ 
      "; 

      // [+] 
      QueriesAll.push(queryStr); 
      ParamsAll.push({ 
       aparams: aparams 
      }); 

     } // end a++ 


     // --> loop queries 
     loopQueries(QueriesAll, ParamsAll).then(
      function(success){ 
       // --> 
       queryWeights(); 
      }, 
      function(error){ 
       // ... 
      } 
     ); 
} 

쿼리 3 속성3210

function loopQueries(Queries, Params) { 
    var promises = {}; 
    for (var i=0; i<Queries.length; i++) { 

     var queryStr = Queries[i]; 
     var params = Params[i]; 

     var promise = queryNeo(queryStr, params); 
     promises[i] = promise;//promise; 
    }; 
    return Q.all(promises); 
} 

function queryNeo(queryStr, params) { 
    var qq = Q.defer(); 
    db.cypher({ 
     query: queryStr, 
     params: params, 
    }, function (error, results) { 
     if (error) { 
      qq.reject(error) 
     } else { 
      qq.resolve(results) 
     } 
    }); 
    return qq.promise; 
} 

지연 테스트

내가 테스트를 수행하는 I는 관계를 만들기 전에 몇 초를 기다렸다

. 실제로 딜레이가 포함될 때 즉시 작동합니다. 그러나 왜 내 쿼리가 반환되는지 이해하지 못합니다. 그렇지 않은 경우에도 마찬가지입니다. 이 대기 시간 문제는 어떻게 해결 될 수 있습니까?

+0

거래가 완료되면 약속이 복구됩니까? 진술뿐만 아니라, tx를 완료해야합니다. 코드를 공유하는 것이 가장 좋습니다. –

+0

@MichaelHunger 스크립트를 공유했습니다. – JohnAndrews

+0

'loopQueries'를 호출하는 코드와 관계를 생성하는 코드를 보여줍니다. 즉, 전체 논리 흐름을 표시합니다. – cybersam

답변

2

이 방법으로 문제가 해결 될지 모르지만 코드가 불필요하게 복잡합니다. 최소한 단순화하면 이해하고 디버그하는 것이 더 쉬워집니다.

동일한 Cypher 쿼리 문자열을 포함하는 배열을 만들 필요가 없으므로 Q.all()을 사용할 필요가 없습니다. UNWIND을 사용하여 각 Cypher 쿼리를 조정하여 전달 된 paramsAll 항목을 한 번에 하나씩 처리 할 수 ​​있습니다.

다음 수정 된 코드 버전을 테스트하지는 않았지만 최소한 단순화하는 방법에 대한 아이디어를 제공해야합니다. loopQueries 기능은 더 이상 필요하지 않습니다.

function querySubjects() { 
    var query = " \ 
     UNWIND {sparams} AS param 
     MERGE (s:Subject { sid: param.sid }) \ 
     SET s = param \ 
     "; 

    var paramsAll = []; // array of objects 

    for (var i=0; i<sidArray.length; i++) { 

     // [subjects] 
     var sid   = sidArray[i]; 
     var sparams  = {}; 
     sparams['sid'] = sid; 

     paramsAll.push({ 
      sparams: sparams 
     }); 

    } // end s++ 

    // --> loop queries 
    queryNeo(query, paramsAll).then(
     function(success){ 
      // --> 
      queryAttributes(); 
     }, 
     function(error){ 
      // ... 
     } 
); 
} 


function queryAttributes() { 
    var query = " \ 
     UNWIND {aparams} AS param 
     MERGE (a:Attribute { aid: param.aid }) \ 
     SET a = param \ 
     "; 

    var paramsAll = []; // array of objects 

    // ----------------------------------------------------------------- 
    // init attributes 
    var aidArray = []; 

    for (var i=0; i<sidArray.length; i++) { 

     var sid    = sidArray[i]; // array of keys 
     var attributes  = subjects[sid]; // object of attributes 
     var attributesArray = Object.keys(attributes); 

     for (var j=0; j<attributesArray.length; j++) { 
      var aid = attributesArray[j]; 
      aidArray.push(aid); 
     } // end a++ 

    } // end s++ 

    // filter out duplicates (works fine) 
    aidArray  = aidArray.filter(onlyUnique); 

    // ----------------------------------------------------------------- 
    // create queries 

    for (var j=0; j<aidArray.length; j++) { 

     // [attributes] 
     var aparams    = {}; 
     aparams['aid']   = aidArray[j]; 

     paramsAll.push({ 
      aparams: aparams 
     }); 

    } // end a++ 


    // --> loop queries 
    queryNeo(query, paramsAll).then(
     function(success){ 
      // --> 
      queryWeights(); 
     }, 
     function(error){ 
      // ... 
     } 
); 
} 

function queryWeights() { 

    var query = " \ 
     UNWIND {params} AS param 
     MATCH (a:Attribute{ aid: param.aid }) \ 
     MATCH (s:Subject { sid: param.sid }) \ 
     MERGE (s)-[w:WEIGHTED {wid: param.wparams.wid }]->(a) \ 
     SET w = param.wparams \ 
     RETURN a,s \ 
     "; 

    var paramsAll = []; // array of objects 

    for (var i=0; i<sidArray.length; i++) { 

     // [subjects] 
     var sid   = sidArray[i]; 

     // [attributes] 
     var attributes   = subjects[sid]; 
     var attributesArray  = Object.keys(attributes); 

     for (var j=0; j<attributesArray.length; j++) { 

      // ... 
      var aid       = attributesArray[j]; 
      var aweight      = attributes[aid]; 

      var wparams      = {}; 

      // [weights] 
      wparams['wid']   = sid + '-' + aid; 
      wparams['aweight']  = aweight; 

      paramsAll.push({ 
       sid: sid 
       aid: aid, 
       wparams: wparams 
      }); 

     } // end a++ 
    } // end s++ 


    // --> loop queries 
    queryNeo(query, paramsAll).then(
     function(success){ 
      // <-- 
      console.log('success') 
     }, 
     function(error){ 
      // ... 
     } 
); 

} 
+0

와우, 언 와인드라는 내가 찾고있는 것입니다. 다시 시도해보고 작동하는지 확인해 봅니다 (이 모든 것이 3 가지 쿼리에서 제외되기 때문에 기분이 좋습니다) – JohnAndrews

+0

작동했습니다! '{param}'이 아닌'param'을 사용해야합니다. 약간 어려움이 있습니다. – JohnAndrews

관련 문제