2.1语法不适用于2.2。通过父类

时间:2016-09-21 10:09:58

标签: orientdb orientdb-2.1 orientdb2.2

您好OrientDB粉丝,

我遇到的问题比我想花费更多的时间。

在2.1中,我能够 通过更新父类 从单个命令更新父记录和子记录,或只更新子记录。但是,2.2中的,它不起作用 ..我在两者中都使用了相同的语法。

采用以下样本数据集

create class Users
create property Users.username
create property Users.password

create class Devices
create property Devices.name

insert into Users (username, password) values('johndoe','randompassword')

  update users add Devices = [{
            "@type": "d",
            "@class": "Devices",
            "name": "Note 7"
        }]

让我们说我们刚刚插入的Device类记录最终摆脱了#13:0

在版本 2.1 中,我可以执行以下语法,以便更新父记录和子记录。 完美无缺

  update users set username = 'johndoethesenior', Devices = [{
            "@type": "d",
            "@rid":   #14:0,
            "@version":1,
            "@class": "Devices",
            "name": "Note 8"
        }] where username = 'johndoe'

我的问题存在。在2.1中它完美地运作。但是,2.2中的,即使我没有收到错误并且显示记录已更新,设备记录上的名称也不会从注释7更改为注释8.

父记录的更改确实经过并从johndoe更改为johndoethesenior。

我查看了发布说明和2.1的更改 - > 2.2并且找不到任何对此的引用。

我发现了一个错误,还是我忽略了2.2发布后东方架构发生了变化的事情。

最后请注意,我在不同服务器和部署的至少4个2.2版本上尝试了这一点。所有人都有相同的行为。

对此问题的任何指导都将非常感激。

谢谢,

2 个答案:

答案 0 :(得分:0)

随着工作的开展,你可以试试这个简单的JS功能:

var g = orient.getGraph();
var b = g.command("sql","update users set username = '"+newUserName+"' where username = '"+userName+"'");
var c = g.command("sql","update devices set name = '"+newDeviceName+"' where name = '"+deviceName+"'");

这就是你在工作室中调用它的方式:

select newUpdate("new value of class users","value to replace of class users","new value of class devices","value to replace of class devices")

希望有所帮助

此致

答案 1 :(得分:0)

作为一种解决方法,您可以使用SQL BATCH

我使用了你的结构 enter image description here

我使用了这个sql批处理命令

begin 
let $a= update users set username="johndoethesenior" return after $current.Devices.@rid where username="johndoe"
let $b = update $a.value set name="Note 8" return after $current.@rid 
commit
return [$a.size(),$b.size()]

enter code here

我得到了

enter image description here

希望它有所帮助。