RDF OWL-一条语句可以用作另一条语句的对象吗?

RDF OWL-一条语句可以用作另一条语句的对象吗?,rdf,owl,ontology,semantic-web,rdfs,Rdf,Owl,Ontology,Semantic Web,Rdfs,我正在学习语义网,我试图对这种技术的可能性和局限性有一个清晰的理解,到目前为止,它看起来非常有趣 我想知道一个用例,但不确定是否可以用RDF对它进行建模,以及它在RDF和OWL原则方面是否仍然有意义。是否可以将一条语句用作另一条语句的对象? 以下是一个基本模式: 和伪三元组: A hasValue B. C hasValue <A hasValue B>. 这似乎并不方便:要么将所有关系建模为语句资源(以便以后可以在另一个语句中作为对象使用),要么按字面形式声明(如上面的伪三元组

我正在学习语义网,我试图对这种技术的可能性和局限性有一个清晰的理解,到目前为止,它看起来非常有趣

我想知道一个用例,但不确定是否可以用RDF对它进行建模,以及它在RDF和OWL原则方面是否仍然有意义。是否可以将一条语句用作另一条语句的对象? 以下是一个基本模式:

和伪三元组:

A hasValue B.
C hasValue <A hasValue B>.
这似乎并不方便:要么将所有关系建模为语句资源(以便以后可以在另一个语句中作为对象使用),要么按字面形式声明(如上面的伪三元组中所述),但稍后应将其切换到语句资源

最后,除了RDF中的描述之外,是否可以使用OWL来定义支持这种情况的本体

编辑2020年11月19日:

我正在添加一些细节,以便更好地描述我想要实现的目标

在上面的例子中,我希望A有一个B值,CA值相同。由于描述C值的语句没有直接使用B作为对象,我知道B的最终值必须从多个语句中推断出来

我希望能够在以后编辑关于A值的语句,但仍然希望C具有与A相同的值(将再次推断其值)

下面是一个更好的例子(我希望如此),说明我的想法:

  • 通过以下陈述,我想推断C的值为B
  • 然后,如果我编辑定义A值的语句如下,我希望推断C的值得到不同的结果(B1):
这是RDF可以实现的吗

非常感谢

具体化(将一个三元组转换为
rdf:Statement
实例的过程)在这种情况下我觉得没有什么用处。相反,我认为空白节点就足够了:

:A :hasValue _:b .
:C :hasValue _:b .
即使没有任何本体,RDF也有一点内置逻辑:空白节点。您可以讨论特定实体(通过其IRI)或特定数据段(作为文字),但也可以讨论某些资源。这通常用于“匿名”资源(如您不想提出特定IRI的结构化值),但它也具有这种存在意义

这两个语句指定了一些资源,即A和C的值。资源未被明确标识,并且这两个语句一旦被显式提供(将使空白节点冗余)就可以“满足”:

那么,如果只为其中一个资源指定了该值,该怎么办

:A :hasValue :B .
请注意,如果没有
hasValue
的附加信息,则无法推断
\ub
实际上是b,因为A可以有多个值,并且其中只有一个值可以是C的值。这可以通过OWL轻松指定:

:hasValue owl:FunctionalProperty .
这意味着
:B
:B
必须指同一个人,因为A不能有多个值


如果A可以有一个以上的值,那么你将不得不通过空白节点来描述它,它可以选择它(就像你在查询中那样),或者你必须以某种方式识别那个特定的值。最简单的选择是使用

owl:sameAs

:A :hasValue :valueOfA .
:C :hasValue :valueOfA .

:valueOfA owl:sameAs :B .
如果你愿意,你可以使用物化(和猫头鹰2),但我认为这不值得:

:hasValueObjectOf a owl:ObjectProperty ;
  rdfs:range [
    a owl:Restriction ;
    owl:onProperty rdf:predicate ;
    owl:hasValue :hasValue
  ] .

[
  a owl:ObjectProperty ;
  owl:propertyChainAxiom ( :hasValueObjectOf rdf:object ) .
] rdfs:subPropertyOf :hasValue .


:rel a rdf:Statement ;
  rdf:predicate :hasValue ;
  rdf:object :B .

:A :hasValueObjectOf :rel .
:C :hasValueObjectOf :rel .
本质上,您可以识别这个“具有特定值”的不完整语句,并对其进行“去序列化”,以便它实际上意味着
:hasValue


最后,您可以指定A的所有值也是C的值:

:isValueOf owl:inverseOf :hasValue .

[
  a owl:Restriction ;
  owl:onProperty :isValueOf ;
  owl:hasValue :A
] rdfs:subClassOf [
  a owl:Restriction ;
  owl:onProperty :isValueOf ;
  owl:hasValue :C
] .

要对RDF中的语句进行说明,您可以像以前一样使用标准具体化,也可以使用RDF引擎的RDF*,SPARQL引擎确实支持这一点:在OWL中,您可以注释公理,但听起来更像是想要n元关系:谢谢您的快速回答!关于RDF*,我的理解是,一条语句可以用双尖括号写在另一条语句中。但是,“嵌入式”语句没有IRI,因此不能在其他地方引用。是这样吗?假设我有一个资源D(类似于C“具有a具有的值”),语句a->B不能被引用两次(首先作为描述C具有的值的语句的嵌入对象,然后作为描述D具有的值的语句的嵌入对象)。由于我还是RDF新手,我可能在这一点上错了,但这有意义吗?不确定我是否理解正确,但语句标识符只是语句本身。“A的值”-在RDF中不能做的是生成引用其他语句的语句,只需编写相同的RDF资源即可。就像你不能说
B isBornIn X
A isBornIn{where_B_isBornIn}
-如果你是这个意思的话。关于事实数据的一般性陈述可以通过RDFS或OWL+中的模式公理来完成。您可以使用SWRL之类的规则语言。但是如果我们从最初的问题回到您的示例,它将只是两个RDF(*)三元组
A hasValue B.C hasValue.
-但这并不意味着
C
具有
A
所具有的值-不存在传递性推理链。但也许我只是误解了你的问题,尽管我很乐意回答更多的问题,如果这有帮助的话
:hasValue owl:FunctionalProperty .
:A :hasValue :valueOfA .
:C :hasValue :valueOfA .

:valueOfA owl:sameAs :B .
:hasValueObjectOf a owl:ObjectProperty ;
  rdfs:range [
    a owl:Restriction ;
    owl:onProperty rdf:predicate ;
    owl:hasValue :hasValue
  ] .

[
  a owl:ObjectProperty ;
  owl:propertyChainAxiom ( :hasValueObjectOf rdf:object ) .
] rdfs:subPropertyOf :hasValue .


:rel a rdf:Statement ;
  rdf:predicate :hasValue ;
  rdf:object :B .

:A :hasValueObjectOf :rel .
:C :hasValueObjectOf :rel .
:isValueOf owl:inverseOf :hasValue .

[
  a owl:Restriction ;
  owl:onProperty :isValueOf ;
  owl:hasValue :A
] rdfs:subClassOf [
  a owl:Restriction ;
  owl:onProperty :isValueOf ;
  owl:hasValue :C
] .