【发布时间】:2020-06-11 09:54:49
【问题描述】:
我目前正在尝试创建一个 SPARQL 查询,如果它在目标图中不存在,它可以插入新的公理。我正在使用集成 Jena ARQ 的 ONT-API。
这是我对空白本体的目标查询:
PREFIX t: <testOntologyIRI#>
INSERT DATA {
t:testClassA t:hasProperty t:testClassB
}
这不会产生预期的结果:我的空白本体中的一个新公理testClassA hasProperty testClassB
如果目标本体中不存在新属性,我在生成新属性时会遇到一些问题。
问题是,如果我在上面运行相同的查询(知道属性 hasProperty 存在于本体中)==> 它会隐式生成单独的 testClassA、testClassB,最后是我的目标公理。
为了解决这个“问题”,我想在查询中创建条件,例如:
PREFIX t: <testOntologyIRI#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
INSERT DATA {
t:testClassA ?hasProperty t:testClassB .
BIND(IF(EXISTS{t:hasProperty},t:hasProperty, t:hasProperty a owl:ObjectProperty) as ?hasProperty).
}
这个查询对我来说很乱,它不起作用。 您建议编辑什么来自动生成本体中不存在的属性,并且需要插入所需的公理?
最好的问候,
【问题讨论】:
-
EXISTS{t:hasProperty}- 这应该怎么做?我的意思是,图形模式是预期的,所以你应该这样做EXISTS{?s t:hasProperty ?o}- RDF 中的存在是由语句也就是三元组定义的。 RDF 节点本身并不存在。 -
下一点:
t:hasProperty, t:hasProperty a owl:ObjectProperty)- 你不能将三元组绑定到变量,你从哪里得到这个?到目前为止,我还没有理解 BIND 的全部意义。你到底想达到什么目标? -
insert data不允许此类使用 - 查看insert {} where {}更新...将您的支票放在where此类更新的一部分中 -
谢谢大家的回答。我完全清楚我的要求是不可行的。 @UninformedUser 和
EXISTS{t:hasProperty}我想检查的是当前图中是否存在此属性。如果不存在,我想创建它。我这样做是因为 SPARQL 不会像处理不存在的个体那样自动生成不存在的属性(使用 INSERT DATA 但不使用 INSERT 查询格式)。你怎么看? -
见@DamyanOgnyanov 的回答。 INSERT 可以像 INSERT DATA 一样添加三元组。它允许有条件的部分。
标签: sparql jena owl ontology owl-api