【问题标题】:SPARQL - INSERT property if not existsSPARQL - 如果不存在则插入属性
【发布时间】: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


【解决方案1】:

您需要使用减号条件来测试不存在特定三元组。

prefix t:<testOntologyIRI#>

insert { t:testClassA t:hasProperty t:testClassB .
         t:hasProperty rdf:type owl:Property
 }
where { minus { t:hasProperty rdf:type owl:Property }}

如果属性已经存在,则不会插入任何内容。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2014-06-11
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多