我试图在OrientDB工作室使用的生成在功能组工作站不在一个人使用。 让这些顶点查询工作正常,但我试图避免导线,因为它是很慢 - 太慢了在生产中使用。 而不是通过每个自由站迭代,并与所有它的邻居们一起分组它,保持每个分组“命名”在设定最小@rid。
var groups = {}; //The list of groups of workpoints. The key is the lowest RID in the group
var mappedDesks = {}; //Every desk's RID is in this object with it's matching value being the group name they're in
//Get all Workpoints that don't have a Locale CURRENTLY_LOCATED_ON them
var freeDesks = db.query("SELECT FROM Workpoint WHERE @rid NOT IN (SELECT @rid FROM (SELECT EXPAND(OUT('CURRENTLY_LOCATED_ON').OUT('LOCATED_ON')) FROM Person) WHERE @class = 'Workpoint')");
//Iterate through all vacant Workpoints
for (var j=0; j < freeDesks.length; j++){
var baseNodeRid = freeDesks[j].getRecord().getIdentity().toString(); // The RID of the Workpoint
var baseNodeNumber = parseFloat(baseNodeRid.replace("#", "").replace(":",".")); // The RID converted to a number for comparisons. The lower RID takes precedence
var baseSanitized = baseNodeRid.replace(":","-") // Keys cannot contain colon so they are replaced with a dash
if (freeDesks[j].getRecord().field("out_NEIGHBOUR_OF") == null ) {
// Desks without neighbours can be put in a group on their own
groups[baseSanitized] = new Array();
groups[baseSanitized].push(baseNodeRid);
mappedDesks[baseSanitized] = baseSanitized;
} else {
//Iterate over all the desk's neighbours
for (var n = 0; n < freeDesks[j].getRecord().field("out_NEIGHBOUR_OF").length; n++){
//Convert the neighbour's RID to a number too
var nSanitized = n.replace(":","-");
if (parseFloat(n.replace("#", "").replace(":",".")) > baseNodeNumber ){
//The neighbour's node group is larger than the current one. This needs to be merged into the group with the smaller rid
//Move the desks from the neighbour's group into the base's group. If it has none then do nothing
var nGroup = groups[mappedDesks[nSanitized]]
if ( nGroup != null) {
groups[baseSanitized] = groups[baseSanitized].concat(nGroup);
//Change the mapping of each moved desk to the base's
for (var g = 0; g < nGroup.length; g++){
mappedDesks[nGroup[g]] = baseSanitized;
}
}
//Delete the reference to the old group
delete groups[mappedDesks[nSanitized]];
//Update the mappings for the desks dealt with
mappedDesks[nSanitized] = baseSanitized;
mappedDesks[baseSanitized] = baseSanitized;
} else {
// The neighbour is lower than the current desk so the desk should be merged into the neighbour's group
mappedDesks[baseSanitized] = nSanitized;
groups[nSanitized].push(baseNodeRid);
}
}
}
}
return groups;
我的问题来自于访问一个顶点的邻居。 它正确地确定是否有if语句邻居return freeDesks[j].getRecord().field("out_NEIGHBOUR_OF")
但我希望能够得到每个邻居的@rid这样我就可以在@rids成组进行排序。
freeDesks[j].getRecord().field("out_NEIGHBOUR_OF")
返回边缘记录,但我不似乎能够得到“中”或使用该字段()方法“走出去”领域(不是这个对象上找到)或访问它作为数组[]。
[
{
"@type": "d",
"@rid": "#34:18176",
"@version": 6,
"@class": "NEIGHBOUR_OF",
"out": "#16:13",
"in": "#16:1408",
"@fieldTypes": "out=x,in=x"
}
]
你能帮助是让邻居列表/阵列@rids这样我就可以在他们重复的代码的其他人呢?
干杯!