OrientDB使用Javascript函数创建边不起作用

OrientDB使用Javascript函数创建边不起作用,javascript,orientdb,Javascript,Orientdb,你好 我有两个班,一个代表住院的Ricoveri,另一个代表出院的Dimissioni。两者都有一个名为nologico的属性,表示入院的唯一标识符 受Luca Garulli的一篇文章启发,我编写了一个Javascript函数,用于递归地在Nosologico属性的两个类之间创建边 功能代码如下: var g=orient.getGraph(); var b=g.command('sql','select from Ricoveri') for(i=0; i<b.length; i++

你好

我有两个班,一个代表住院的Ricoveri,另一个代表出院的Dimissioni。两者都有一个名为nologico的属性,表示入院的唯一标识符

受Luca Garulli的一篇文章启发,我编写了一个Javascript函数,用于递归地在Nosologico属性的两个类之间创建边

功能代码如下:

var g=orient.getGraph();
var b=g.command('sql','select from Ricoveri')

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

var id=b[i].getProperty("Nosologico").toString();

var rid=b[i].getId().toString();

var r=g.command("sql", "select from Dimissioni where Nosologico = '" + id + "'");

if(r.length>0){  
var sql2="create edge dimesso from " + rid + " to (select from Dimissioni where Nosologico = '" + id + "')";

g.command('sql',sql2);
}
}
该函数成功创建并执行,没有错误,但不创建任何边。 有时整个服务器会被冻结,我除了杀死它并重新启动它之外别无选择

这个功能有什么问题吗

谢谢。
QQ

也许我错了,但是,你来做查询

var r=g.command("sql", "select from Ricoveri where Nosologico = '" + id + "'");
然后验证结果的长度,但很明显,>0 VarID来自VarB,VarB来自Ricoveri上的第一个查询

我是说,也许在var r中你想从Dimissioni查询

var r=g.command("sql", "select from Dimissioni where Nosologico = '" + id + "'");

首先,我建议,如果您还没有这样做的话,在两个类中的nologico属性上创建唯一的\u散列\u索引

然后假设Dimissioni中的每个Nologico也存在于Ricoveri中,并且假设Dimissioni比Ricoveri更少,下面的查询应该更有效

var g=orient.getGraph();
var b=g.command('sql','select from Dimissioni');
var id="";
var rid="";
var sql2="";

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

id=b[i].getProperty("Nosologico").toString();

rid=b[i].getId().toString();

sql2="create edge dimesso from (select from Ricoveri where Nosologico = '" + id + "') to " + rid;

g.command('sql',sql2);
g.commit();

}
让我知道这是否有帮助


Ivan

我刚刚注意到服务器命令窗口中的一条消息:“Select from Ricoveri”返回一个包含10000多条记录的结果集。检查您是否真的需要所有这些记录,或者通过使用限制来提高性能和使用的RAM来减少结果集10000条记录对于我的需要来说太少了。如果没有这个限制,我怎么能做到同样的结果呢?嗨,难道在退职班里没有一个和Ricoveri一样的医院记录吗?您可以尝试插入一些打印内容;对于调试,不要担心,这只是一个警告,查询已经完成了是的,很抱歉,这是一个输入错误。实际上,我已经用更复杂、更长的名称修改了原始的查询。我确实检查了Dimissioni而不是RicoveriI的存在,我尝试了你的修正函数,它对我有效。边缘已正确创建感谢Ivan对您的支持。不幸的是,它对我仍然不起作用,而且经常会使服务器崩溃。但我开始认为我的安装可能有问题。在运行批处理脚本创建错误边和重复边时,我也遇到了创建错误边和重复边的问题。这可能是因为服务器是双服务器集群的一部分吗?一个集群已经死了?我已经开始使用oetl进行新的安装并重新导入数据。然而,当我运行上述javascript函数时,服务器仍然完全不可靠,并且崩溃,尽管它报告边缘已成功创建。有时它会成功,但会产生错误的和太少的边缘。我在Win 8.1 64位开发机器上使用windows版本。那么您使用的是分布式服务器,您的配置是什么?在default-distributed-db-config.json文件中找到的服务器数、读/写仲裁设置。现在分布式存在一些问题..谢谢Ivan,我已经对之前的回复发表了评论。Dimissioni和Ricoveri是一对一的关系,所以不会有任何区别。nologico属性上已经存在索引,它是唯一的,不是唯一的\u HASH\u索引,但我认为这不会导致不稳定和错误的结果。无论如何,这个函数应该更有效。请试一试。tnxbtw,散列索引很快,我认为您的函数在创建4451个边后返回此错误…坦率地说,我看不出它有什么问题,因为它看起来是正确的:没有创建边,因为没有源顶点16\n没有创建边,因为没有源顶点。错误消息也不可靠。嗨,Ivan,我已经截断了Dimeso类,用REMOVE out_Dimeso选项更新了Ricoveri,并再次运行脚本。这一次它对所有10798名Ricoveri都有效…仍然无法理解为什么会有如此不可预测的行为。将尝试再次为其他边运行类似的脚本,并查看其行为。与此同时,我注意到OrientDB Studio在新安装中没有保留命令历史记录……虽然是个小问题,但很烦人