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

Sparql 如何创建一个类作为具有定义类型的RDF语句的类的等价物?,sparql,rdf,owl,shacl,Sparql,Rdf,Owl,Shacl,我有三个类,我们称它们为:A,:B和:C,还有一个属性:p 当:xa:B和:yac 目前我更喜欢使用OWL的解决方案,但也可以使用SPARQL和/或SHACL。修订版…这可能无法满足您的需要,因为它是在推断rdf:语句,而不是独立的三元组。我想不出没有具体化怎么做。可能是命名图,尽管这通常与OWL实现不兼容。也许你会喜欢 还有,也许你已经知道怎么做了 有人断言lemonTest是一个rdf:语句。通过隐士的推理,可以推断柠檬汁是一种有味道的陈述 @prefix : <http://exam

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

:xa:B
:yac


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

修订版…这可能无法满足您的需要,因为它是在推断rdf:语句,而不是独立的三元组。我想不出没有具体化怎么做。可能是命名图,尽管这通常与OWL实现不兼容。也许你会喜欢

还有,也许你已经知道怎么做了

有人断言lemonTest是一个rdf:语句。通过隐士的推理,可以推断柠檬汁是一种有味道的陈述

@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:。
@前缀rdf:。
@前缀rdfs:。
@基地。
[rdf:type owl:Ontology;
owl:导入rdf:,
RDF:
] .
:flavor rdf:type owl:ObjectProperty。
:vourstatement rdf:type owl:Class;
owl:equalentClass[rdf:type owl:Restriction;
owl:onProperty-rdf:object;
猫头鹰:一些价值来自:味道
] ,
[rdf:类型owl:限制;
owl:onProperty-rdf:subject;
猫头鹰:一些价值来自:水果
] ;
rdfs:子类rdf:语句。
:水果rdf:type猫头鹰:类。
:柠檬a:水果。
:lemonTest rdf:type owl:NamedIndividual,
rdf:声明;
rdf:对象:味道;
rdf:谓词:结果;
主题:柠檬。
酸的味道。
第一次尝试: 我也不是猫头鹰专家,但《普洛特》中的隐士推理者并不抱怨这一点:

@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 .
@前缀:。
@前缀rdf:。
@前缀owl:。
@前缀rdfs:。
:root a owl:Class。
:A rdf:语句;
rdf:受试者:X;
rdf:谓词p;
rdf:对象:Y;
rdfs:subassof:root。
:B rdfs:子类:根。
:C rdfs:subassof:root。
:xa:B。
:p一个owl:ObjectProperty。
:是的。

独立式三元组的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 .
}
前缀:
前缀rdf:
构造{
[]a:a,rdf:Statement;
rdf:受试者?X;
rdf:谓词p;
对象
}
在哪里{
?X a:B。
?X:p?Y。
是的。
}

有了Jena规则,您可能会使用。

如果没有对您试图表达的内容的直观假设,您的问题相当模糊,并且很难解析。这可能是因为为了避免复杂的精确性,您选择了非正式的方式,或者对RDF和OWL概念的含义产生了混淆

我最初对这句话的解释是:

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

那是:

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

在这种情况下很容易回答这个问题:它不能用RDF、RDF、OWL、SWRL、RIF、SPARQL、SPIN、SHACL中的任何一种表示。原因是在任何形式和语言中都不可能约束任何类包含RDF三元组。要做到这一点,就必须让RDF三倍于一等公民

如果有混淆的话,可能是类
rdf:Statement
经常被错误地认为是rdf三元组的类
rdf:Statement
虽然被描述为一种表达语句的方式,但无论您如何编写数据、本体、查询、形状、规则等,都不会以任何方式限制包含rdf三元组。类
rdf:Statement
在形式上只是一个任意的资源类


然而,从评论和答案来看,我对您使用“声明”和“成为成员”的解释很可能与您试图实现的目标不符。

整个声明
:X:p:Y
shell成为
:a
的成员?!你说的是具体化吗?是的,所以最好的解决方案应该是生成语句,但是我很想知道一个关于预生成语句的解决方案。但是这在OWL中是不可能的,不是吗?我不是专家,但我从来没有听说过在OWL类中断言ABox公理。这两种说法都不是通过推断得出的。这可能是不可能的,这就是为什么我建议使用其他方法,比如沙克尔。然而,这可能是可能的(例如,当我在猫头鹰中“发现”双关语时,我发现了一些意想不到的解决方案——与这个案例无关,只是解释了为什么我有希望)“成为”的意思是什么?我看不出问题的标题与问题的内容有什么关系。你能澄清一下吗?请注意,RDF三元组与类
RDF:Statement
没有正式关联。事实上,没有任何形式强制要求
rdf:Statement
包含任何特定内容。它可以是一类数字、一类节目、一类绘画或一类话语。形式上,三元组
:X:p:Y
rdf:Statement
没有任何关系。在这个解决方案中
:A
是一个个体,而不是一个类。我可以想象用一个
owl:equivalentClass
定义
:A
,每个由节点和属性根据条件生成的语句N,在运行推理器后,将成为
的成员:A
:在我的示例中,A被定义为一个个体和一个类,但这无助于你的推断