我有一个简单的本体,它是这样构建的:
| Cell
| CellFree
| CellTree
| CellPlayer
我的应用程序正在使用Stardog,我想动态更新个人的类型,该类型在开始时是一个Cell
,需要更新为其中一个子类。
我的第一个方法是这样的:
DELETE {?c rdf:type :Cell}
INSERT {?c rdf:type :CellFree}
WHERE {?c a :Cell . ?c :x 6 . ?c :y 3}
不幸的是,这会删除单元格,但不会将其插入回去。我怎样才能做到这一点?每个单元格都有属性和数据,因此在此过程中不要丢失它们很重要(我是SPARQL的新手)。
作为子类成员的东西通常并不意味着它不是超类的成员(所以你可以完全省略DELETE
)。 我知道这是您当前选择的解决方法。
也就是说,这只是一个猜测,我认为这应该无关紧要,但是您是否尝试过简单地颠倒DELETE
和INSERT
的顺序?鉴于您总体上所描述的内容,您还可以尝试将它们转换为两个不同的SPARQL查询,这些查询按顺序执行(在这种情况下,您肯定希望首先执行INSERT
)。除了这些想法(即使他们做你想做的事),你描述的行为听起来像是Stardog中的一个错误,所以我也会寻求他们的直接支持。