1

我有三个类,我们称它们为:A:B还有:C一个 property :p

每个语句X: :p :Y都应该成为:A, when:X a :B:Y a :C

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

4

3 回答 3

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(...).

于 2017-05-16T15:18:20.997 回答
1

如果没有对您要表达的内容的直观假设,您的问题相当模棱两可,而且完全不可能解析。这可能是由于您为了避免复杂的精确性而选择了非正式的,或者是对 RDF 和 OWL 概念的含义的混淆。

我最初解释这句话的方式:

每个语句X: :p :Y都应该成为:A

那是:

形式的每个 RDF 三元组?x :p ?y(其中?x?y分别是任何主语和宾语)都可以推断为 class 的成员 :A

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

如果存在混淆,则可能是该类rdf:Statement经常被错误地认为是 RDF 三元组的类。rdf:Statement,尽管被描述为一种表达关于语句的语句的方式,但无论您如何编写数据、本体、查询、形状、规则等,它都不受任何方式的约束以包含 RDF 三元组。该类rdf:Statement只是形式上的一个任意类别的资源。

但是,查看评论和答案,很可能我对您使用“声明”和“成为会员”的解释不适合您想要实现的目标。

于 2017-05-18T20:14:06.060 回答
0

已修改... 这可能无法满足您的需求,因为它是在推断rdf:Statement,而不是独立的三元组。如果没有具体化,我无法弄清楚如何做到这一点。也许有命名图的东西,尽管这通常与 OWL 实现不兼容。也许你会喜欢Blazegraph 的“Reification Done Right”

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

断言lemonTest 是一个rdf:Statement。在 Hermit 推理的情况下,可以推断出 lemonTest 是一个风味语句。

@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é 中的隐士推理者并没有抱怨这一点:

@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 .
于 2017-05-16T12:49:41.763 回答