加权RDF谓词(owl:ObjectProperty)

7
在RDF中,语句用S、P和O表示;在OWL中,owl:ObjectProperty代表谓词逻辑。
 (S) (P) (O)   
  I like dog

<owl:Class rdf:about="Person" />
<owl:NamedIndividual rdf:about="I">
    <rdf:type rdf:resource="Person"/>
    <like rdf:resource="Dog"/>
</owl:NamedIndividual>

<owl:Class rdf:about="Pet" />
<owl:NamedIndividual rdf:about="Dog">
    <rdf:type rdf:resource="Pet"/>
</owl:NamedIndividual>

<owl:ObjectProperty rdf:about="like">
    <rdfs:domain>
        <owl:Restriction>
            <owl:onProperty rdf:resource="like"/>
            <owl:someValuesFrom rdf:resource="Person"/>
        </owl:Restriction>
    </rdfs:domain>
    <rdfs:range>
        <owl:Restriction>
            <owl:onProperty rdf:resource="like"/>
            <owl:someValuesFrom rdf:resource="Pet"/>
        </owl:Restriction>
    </rdfs:range>
</owl:ObjectProperty>

那么如何描述我对狗的喜爱程度呢?如何给谓词赋予属性或值呢?一个解决方案是将一个(S,P,O)语句扩展为3个语句。例如:

(S)             (P)        (O) 
 Person       isSrcOf    LikeRelation
 Pet          isTargetOf LikeRelation
 LikeRelation hasValue   [0~100]

这应该可以运行,但很明显会让本体变大3倍 :(

非常感谢任何建议!


http://www.w3.org/TR/2004/WD-swbp-n-aryRelations-20040721/ - rnd_nr_gen
4个回答

7
我不会使用RDF重ification,不仅在这种情况下,几乎在任何情况下都不会。RDF重ification只会让事情变得更加复杂。正如您所评论的,它将使您的本体膨胀,但不仅如此,它还将使您的本体非常难以应用OWL推理。
我处理过与您提出的相同场景,并且大多数情况下,我最终采用了以下设计。
(S) (P) [ (P) (O) (P) (O)]
我喜欢[ '我喜欢什么' 狗 , '我有多喜欢它' '很多']
Class: LikeLevel //it represents class of things a person likes with a degree factor.

ObjectProperty: likeObject
    Domain: LikeLevel
    Range: Pet //(or Thing)

ObjectProperty: likeScale
    Domain: LikeLevel
    Range: xsd:int //(or an enumeration class i.e: 'nothing', 'a bit', 'very much',...)

ObjectProperty: like
    Domain: Person
    Range: LikeLevel

如果您想使用此模型(以RDF/Turtle语法)来表示某些实例数据:
:I :like [ a :LikeLevel; 
   :likeObject :dogs;
   :likeScale 5.7] . 

在这种情况下,我为对象LikeLevel创建了一个空白节点,但您也可以创建一个基础对象,有时您可能需要避免使用bNodes。在这种情况下:
:I :like :a0001 .
:a0001 a :LikeLevel; 
   :likeObject :dogs;
   :likeScale 5.7.

这个设计可以被视为具有再现性的轻量级案例,与RDF再现性的主要区别在于它保留了用户模型中的本体设计。


6
尽管你声称不是这样,但你的回答仍然有效地使用具体化,通过将“like”关系具体化为一种名为“LikeLevel”的一阶实体(一个概念),使你能够附加属性到关系本身,例如对象(“Pet”)和‘scale’(整数值)。这通常是正确的方法,被称为“具体化”。 - user206428
此外,你声称在这种情况下具体化使得执行OWL推理变得困难是不正确的。请注意,具体化不仅适用于将RDF三元组s-p-o转换为三个三元组r-s、r-p、r-o的转换,这确实使得OWL推理变得困难,但在这种情况下,模型中只有一个属性被具体化。 - user206428
2
@rati 你说得对,我所做的可以被认为是计算机科学通用术语“具体化(reification)”。但这不是纯粹的 RDF 具体化,其中使用了 rdf:subject、rdf:predicate 和 rdf:object (请参见 http://www.w3.org/TR/rdf-mt/#ReifAndCont)。我的意思是,当使用 RDF 具体化时,推理很难进行,主要是因为必须始终考虑超出用户数据模型的间接/抽象层次。相反,我的解决方案保持了用户数据模型中的设计。 - Manuel Salvadores
@rati @elgcom的回答已经编辑过,明确说明了RDF再现。 - Manuel Salvadores
1
@msalvadores;我同意在这种情况下_RDF具体化_是完全不合适的,你在这里的解决方案应用了_OWL TBox中的属性具体化_来正确地解决问题。(+1) - user206428
@sharky @elgcom @rati,关于这个问题的后续,我认为值得看一下语义网络邮件列表中的这两个最近的讨论。http://lists.w3.org/Archives/Public/semantic-web/2010Sep/0202.htmlhttp://lists.w3.org/Archives/Public/semantic-web/2010Sep/0155.html - Manuel Salvadores

2
您的建议是正确的,这被称为具体化,它是表示本体论或RDF图中两个项之间关系固有属性的标准方式,在其中语句以成对的方式在项之间进行 - 有时具体化是数据模型本身的限制所必需的。
如果您担心具体化会使本体论膨胀,您可以尝试以下方法,但通常不太理想,并且存在自身的问题:
  1. 创建特定属性,例如somewhatLikesdoesntLikeloves等; 如果您只有有限的替代选择,并且不介意创建额外的属性,则此方法可能适用。如果您打算使用整数(或任何广泛的替代品)编码“相似度程度”,则此方法变得繁琐和笨重(我甚至认为是不正确的)- 按照此方法,您将拥有像likes0likes1,...,likes99likes100这样的属性。此方法还将排除查询例如,人喜欢的所有狗的程度值范围内的情况,这在使用您指定的具体化方法的SPARQL中是可能的,但在此方法中不可能。
  2. likesDogs属性附加到Person实例上,如果可以对该人对所有Dog类型/实例进行断言。当然,这将取决于您此处要捕获的内容;如果是后者,则这也不合适。
祝你好运!

1
我认为@msalvadores搞错了。
我们忘掉狗和点赞吧。我们真正做的是:
a x b
axb y c
axb z d

其中axb语句的标识符,a, b, c, d是主语或宾语,x, y, z是谓语。我们需要做的是以某种方式将a, x, b资源绑定到axb语句。

这就是再现如何实现的:

axb subject a
axb predicate x
axb object b

我认为这很容易理解。
让我们检查一下msalvadores在做什么:
:I :like [ a :LikeLevel; 
   :likeObject :dogs;
   :likeScale 5.7] . 

我们可以轻松地将此翻译为axb术语。
a x w
w type AxbSpecificObjectWrapper
w object b
w y c

这只是用低质量工具和更多的努力来模仿具体化(reification)的方式(你需要一个包装类并定义一个对象属性)。对我来说,a x w语句没有意义;我喜欢像级别一样,哪些对象是狗?

但是如何描述“我喜欢狗”的程度呢?

就我非常有限的RDF知识而言,有两种方法可以做到这一点。

1.) 使用具体化

stmt_1
    a LikeStatement
    subject I
    predicate like
    object dogs
    how_much "very much"

2.) 实例化一个谓词类

I like_1 dogs
like_1
    a Like
    how_much "very much"

这取决于您的口味和实际词汇量,您可以选择其中之一。

我如何给谓词分配属性或值?

我认为您不理解谓词和语句之间的区别。有一个很好的例子可以参考:RDF中具体化的简单示例

Tolkien wrote Lord of the rings
Wikipedia said that

这里的语句是:“

这里的语句:


that: [Tolkien, wrote, LotR]

如果我们要对语句进行陈述,可以写成这样:
[Wikipedia, said, that]

如果我们要对谓词进行陈述,那么我们会写出类似这样的语句:
[Wikipedia, said, wrote]

我认为有很大的区别。实体化是关于对语句进行陈述,而不是关于谓词...


0

我在 Jena 的文档中看到了一句话,引起了我的注意。

...OWL Full allows ... state the following .... construction:

<owl:Class rdf:ID="DigitalCamera">
  <rdf:type owl:ObjectProperty />
</owl:Class>
..

OWL Full 真的允许 ObjectProperty 也可以是一个 Class 吗? 如果 ObjectProperty 可以是一个 Class,并且可以有个体,那么我就可以用它来描述一个语句。

S_individual P_individual O_individual

我可以在P_individual上进一步添加属性。这样对吗? 还是我漏掉了什么?

由于以下RDF是有效的,因此应该可以实现相应的OWL。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://somewhere/" > 

  <rdf:Description rdf:about="http://somewhere/Dog_my_dog">
    <j.0:name>Lucky</j.0:name>
  </rdf:Description>
  <rdf:Description rdf:about="http://somewhere/like_dog">
    <j.0:degree>80</j.0:degree>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/Cat_my_cat">
    <j.0:name>Catty</j.0:name>
  </rdf:Description>
  <rdf:Description rdf:about="http://somewhere/like_cat">
    <j.0:degree>86</j.0:degree>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/Person_I">
    <j.0:name>Bob</j.0:name>
    <j.0:like_dog rdf:resource="http://somewhere/Dog_my_dog"/>
    <j.0:like_cat rdf:resource="http://somewhere/Cat_my_cat"/>
  </rdf:Description>

</rdf:RDF>

RDF/XML语法非常难以阅读,我建议您使用RDF/Turtle或Manchester Syntax编写您的帖子和评论。它们更容易理解。 - Manuel Salvadores
如果Catty对狗的喜爱程度与Bob不同,会发生什么?由于您的信心程度附加在属性上,因此您将无法拥有不同的程度。除此之外,您需要拥有多个属性,以涵盖一个人可能喜欢的所有东西。 - Manuel Salvadores
@msalvadores:当然,我不确定这个想法是否是一个好的实践。在我的应用程序中,“关系”(例如喜欢)比主语或宾语更重要。因此,我希望对它们进行建模,以便可以轻松地遍历或查询这些关系。 - rnd_nr_gen
假设您有一个名为<p1>的owl:ObjectProperty实例。 您不能有另一个实例<p2>,其中<p2> rdfs:subClassOf <p1>吗? 然后给根(<p1>)一些属性,这些属性将赋予所有实例(具有rdfs:subClassOf <p1>)skos:narrowerTransitive到<p1>在某种意义上(或后代)? 你可以用这种方式给出LIKE DEGREES。 然后,您只需选择在那些共享相同rdf:Property实例的owl:ObjectProperty实例的属性树中进行自定义的属性。 - Entree
这难道不是合法的做法,比起 @msalvadores 的答案中有一个巨大的实例图更加简洁吗? - Entree
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接