如何创建一个Class作为具有已定义类型的RDF语句的Class的等价物?

时间:2017-05-16 10:51:03

标签: sparql rdf owl

我有三个课程,我们称他们为:A:B:C以及属性:p

X: :p :Y:A

时,每个语句:X a :B都应成为:Y a :C的成员

目前我更喜欢使用OWL的解决方案,但也可以使用SPARQL和/或SHACL。

3 个答案:

答案 0 :(得分:1)

明显的独立三元组SPARQL解决方案:

PREFIX    : <http://example.com/ontology#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

CONSTRUCT {
    [] a             :A, rdf:Statement ;
       rdf:subject   ?X ;
       rdf:predicate :p ;
       rdf:object    ?Y
}
WHERE {
    ?X  a  :B .
    ?X :p  ?Y .
    ?Y  a  :C .
}

使用Jena规则,您可以使用makeSkolem(...)

答案 1 :(得分:1)

你的问题很模糊,如果没有关于你想要表达的内容的直观假设,就很难解析。这可能是由于您选择非正式以避免复杂的精确度,或者是对RDF和OWL概念含义的混淆。

我最初解释句子的方式是:

  

每个声明X: :p :Y都应成为:A

的成员

那是:

  

?x :p ?y形式的每个RDF三元组(其中?x?y分别是任何主题和对象)可以推断为类:A的成员。

在这种情况下很容易回答这个问题:它不能用任何RDF,RDFS,OWL,SWRL,RIF,SPARQL,SPIN,SHACL表示。原因是永远不可能限制任何类包含任何这些形式和语言中的RDF三元组。要做到这一点,就必须将RDF三元组作为该语言的一等公民。

如果存在混淆,可能是类rdf:Statement经常被错误地认为是RDF三元组的类。 rdf:Statement虽然被描述为表达语句陈述的一种方式,但无论如何编写数据,本体,查询,形状,规则等,都不以任何方式限制RDF三元组。正式地说,{1}}是一类任意资源。

然而,看看评论和答案,我对你使用“陈述”和“成为会员”的解释很可能不适合你想要实现的目标。

答案 2 :(得分:0)

修改...... 这可能无法满足您的需求,因为它正在推断 rdf:Statement ,而非独立三联 EM>。如果没有重新表达,我无法想象如何做到这一点。也许是带有命名图的东西,尽管它通常与OWL实现不兼容。也许你想要Blazegraph's "Reification Done Right"

另外,也许你已经知道如何做到这一点。

断言lemonTest是一个rdf:Statement。通过Hermit推理,可以推断出lemonTest是一种flavorStatement。

@prefix : <http://example.com/ontology#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.w3.org/2002/07/owl#> .

[ rdf:type owl:Ontology ;
   owl:imports rdf: ,
               rdfs:
 ] .

:flavor rdf:type owl:ObjectProperty .

:flavorStatement rdf:type owl:Class ;
    owl:equivalentClass [ rdf:type owl:Restriction ;
                         owl:onProperty rdf:object ;
                         owl:someValuesFrom :flavor
                       ] ,
                       [ rdf:type owl:Restriction ;
                         owl:onProperty rdf:subject ;
                         owl:someValuesFrom :fruit
                       ] ;
    rdfs:subClassOf rdf:Statement .


:fruit rdf:type owl:Class .

:lemon a :fruit .

:lemonTest rdf:type owl:NamedIndividual ,
    rdf:Statement ;
    rdf:object :flavor ;
    rdf:predicate :result ;
    rdf:subject :lemon .

:sour a :flavor .

首次尝试: 我也不是OWL专家,但是Protégé的Hermit推理员并没有抱怨这个:

@prefix :      <http://example.com/ontology#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .


:root   a       owl:Class . 

:A      a                rdf:Statement ;
        rdf:subject      :X ;
        rdf:predicate    :p ;
        rdf:object       :Y ;
        rdfs:subClassOf  :root .

:B      rdfs:subClassOf  :root .

:C      rdfs:subClassOf  :root .

:X      a       :B .

:p      a       owl:ObjectProperty .

:Y      a       :C .