Sparql 在turtle或RDF中,我可以在所有符合条件的主语上添加谓词/宾语吗?

Sparql 在turtle或RDF中,我可以在所有符合条件的主语上添加谓词/宾语吗?,sparql,rdf,semantic-web,triplestore,turtle-rdf,Sparql,Rdf,Semantic Web,Triplestore,Turtle Rdf,我正在做一些实验,导入海龟语言中的三元组 在Tomcat中的openrdf工作台webapp中,它包含了一个SPARQL端点 我想知道,对于turtle,或者一般来说,在RDF/RDFS中,是否可以有条件地将所有(隐式)主语上的某个谓词/对象声明添加到另一个谓词/对象的存在中 例如,如果定义了以下三元组: foo:a foo:b foo:c foo:d foo:b foo:c foo:e foo:b foo:c foo:f foo:b foo:c 我想自动将以下谓词/主语添加到与谓词=foo:

我正在做一些实验,导入海龟语言中的三元组 在Tomcat中的openrdf工作台webapp中,它包含了一个SPARQL端点

我想知道,对于turtle,或者一般来说,在RDF/RDFS中,是否可以有条件地将所有(隐式)主语上的某个谓词/对象声明添加到另一个谓词/对象的存在中

例如,如果定义了以下三元组:

foo:a foo:b foo:c
foo:d foo:b foo:c
foo:e foo:b foo:c
foo:f foo:b foo:c
我想自动将以下谓词/主语添加到与谓词=
foo:b
和object=
foo:c
匹配的所有主语中:

(implicit subject) foo:g foo:h
为了自动生成以下三元组:

foo:a foo:g foo:h
foo:d foo:g foo:h
foo:e foo:g foo:h
foo:f foo:g foo:h
这可能吗

或者:有没有办法定义一些三元组,以便SPARQL在查询将
foo:g foo:h
作为谓词/对象的主题时能够找到
foo:a/d/e/f
问题的第一部分可以通过以下两种方式之一解决:

  • 使用推理
  • 使用SPARQL更新
  • 推断 推断是一种技术,通过该技术,您可以定义基于现有三元组推断其他三元组的规则。通常,您可以使用预定义的规则集,也可以使用自己的自定义规则。我认为Sesame只支持预先定义的开箱即用的规则集,所以您可能想看看哪一个后端可以与Sesame一起使用,并且有更多可定制的规则

    推断通常有两种应用方式,一种是只存储规则,每次触发规则时计算附加信息,另一种是预计算所有附加信息并将其添加到数据库中。您想要使用哪一个取决于您打算如何使用您的系统,并且需要进行性能权衡。我不打算详细讨论,因为这实际上是一个完全不同的问题——请参阅以进行讨论

    SPARQL更新 或者,如果您的规则相对简单,并且您可以预先计算额外的信息并将其添加到数据库中,那么您可以编写SPARQL更新来实现这一点,例如

    PREFIX foo: <http://example.org/foo#>
    INSERT
    {
      ?x foo:g foo:h .
    }
    WHERE
    {
      ?x foo:b foo:c .
    }
    

    您可以使用OWL和以下形式的公理进行这种类型的推理

    pa&sq亚组;qb

    也就是说,如果某个东西的属性p的值是a,那么它的属性q的值也是b。作为一个例子,这里有一个本体,有四个个体(a、b、c、d)、两个对象属性(p、q)和公理(pvaluec&sqsubsetq;qvalued)

    @前缀:。
    @前缀rdfs:。
    @前缀owl:。
    @前缀xsd:。
    @前缀rdf:。
    猫头鹰:本体论。
    :p一个owl:ObjectProperty。
    :q a owl:ObjectProperty。
    [猫头鹰:限制;
    owl:onProperty:p;
    owl:hasValue:c;
    rdfs:子类[a owl:限制;
    owl:onProperty:q;
    猫头鹰:hasValue:d].]。
    :猫头鹰:东西,猫头鹰:名字个人;:p:c。
    :b猫头鹰:东西,猫头鹰:名字个人;:p:c。
    :c猫头鹰:东西,猫头鹰:名字个人。
    :d一只猫头鹰:东西,猫头鹰:名字。
    
    在Protégé中,公理如下:

    您可以启用推理器并查询
    q值d
    的实例,请参见:

    或者,您可以浏览到个人并查看结果:


    非常感谢您的回答。是否可以使用OWL来定义这种推理?如果你能举个例子,我将不胜感激。此外,SPARQL能够对OWL声明进行推断吗?在OWL中,可以使用一个公理:
    (b值c)subassof(g值h)
    。这意味着,如果某个东西将
    c
    作为属性
    b
    的值,那么它也将
    h
    作为属性
    g
    @JoshuaTaylor的值,非常感谢您的回答。你知道如何或者是否有可能通过RDF三元组来表达这个公理吗?是的,我添加了一个答案,在Protege中显示了结果,并对本体进行了序列化。复制于。
    PREFIX foo: <http://example.org/foo#>
    SELECT ?x
    WHERE
    {
      ?x foo:g foo:h .
    }
    
    @prefix :      <http://example.org/add-predicate-object#> .
    @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    @prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    
    <http://example.org/add-predicate-object> a owl:Ontology .
    
    :p a owl:ObjectProperty .
    :q a owl:ObjectProperty .
    
    [ a owl:Restriction ;
      owl:onProperty :p ;
      owl:hasValue   :c ;
      rdfs:subClassOf [ a owl:Restriction ;
                        owl:onProperty :q ;
                        owl:hasValue   :d ] . ] .
    
    :a a owl:Thing, owl:NamedIndividual ; :p :c .
    :b a owl:Thing, owl:NamedIndividual ; :p :c .
    :c a owl:Thing, owl:NamedIndividual .
    :d a owl:Thing, owl:NamedIndividual .