내 프로젝트에서 레이블 Subjects
과 Attributes
사이의 관계를 만들려고합니다.병합 관계가 항상 작동하지 않습니다 (지연)
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 개의 관계가 모두 정리됩니다.왜 이런 일이 무엇입니까?
일부 배경 정보 :
이전의 관계 설정에, 나는 노드 주제를 생성하고 첫 번째 속성 않습니다. 그러나, 나는이 작업으로 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는 관계를 만들기 전에 몇 초를 기다렸다
. 실제로 딜레이가 포함될 때 즉시 작동합니다. 그러나 왜 내 쿼리가 반환되는지 이해하지 못합니다. 그렇지 않은 경우에도 마찬가지입니다. 이 대기 시간 문제는 어떻게 해결 될 수 있습니까?
거래가 완료되면 약속이 복구됩니까? 진술뿐만 아니라, tx를 완료해야합니다. 코드를 공유하는 것이 가장 좋습니다. –
@MichaelHunger 스크립트를 공유했습니다. – JohnAndrews
'loopQueries'를 호출하는 코드와 관계를 생성하는 코드를 보여줍니다. 즉, 전체 논리 흐름을 표시합니다. – cybersam