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被定义为一个个体和一个类,但这无助于你的推断