使用Jena为Ontology(RDF / XML序列化)中的类之间的链接赋值

时间:2013-06-20 10:15:28

标签: rdf jena ontology owl

我希望能够自动为连接本体中两个类的链接分配值。只有两个值可以分配给链接;也就是说,如果链接来自连接到它的子类数量较少的类与链接终止的类相比,则链接将被赋值为1,如果链接来自具有更多链接的类,则为其分配值5连接到它的子类的数量,如果所有类具有相同数量的子类,则链接将被赋值为5.

我可以在Jena中加载我的本体,并列出我的本体中每个类的所有子类和超类。

这将帮助我使用任何算法遍历我的RDF图。

2 个答案:

答案 0 :(得分:2)

除了已经存在的谓词URI之外,没有直接的方法来注释RDF图中节点之间的链接。

我有两个选择,我可以看到。第一种是在RDF图表之外保留一个记录权重的表格。假设你有:

ex:Class1 a owl:Class.
ex:Class2 a owl:Class ;
          ex:myWeightedProperty ex:Class1.

并假设我们要为此连接分配权重1.0。您将有一个单独的数据结构记录:

    S      |      P                |        O      |    W
-----------------------------------------------------------
ex:Class2  | ex:myWeightedProperty | ex:Class1     |    1.0

这是紧凑而有效的,但显然需要您保持关于图形的带外信息。特别是,当您将图形序列化为磁盘等时,它不会被保存。

第二种选择是使用一种形式的物化来对图形中的信息进行编码(或者您可以使用RDF物化词汇表,但我认为自己更清晰):

ex:Class1 a owl:Class.
ex:Class2 a owl:Class ;
          ex:linkTo [
             a ex:WeightedLink ;
             ex:predicate ex:myWeightedProperty ;
             ex:to ex:Class1 ;
             ex:weight 1.0
          ].

如果我这样做,我也会包含直接属性链接(即ex:Class2 ex:myWeightedProperty ex:Class1),因为尽管它可以说是多余的,但它并没有太大的开销,并且在这种情况下会使SPARQL查询更加简单。你不在乎体重。

答案 1 :(得分:1)

Ian Dickinson's answer中所述,在RDF中没有直接的方法。 RDF确实有一个用于讨论三元组的物化词汇表,你可以谈论三元组Class1 relatedTo Class2,称之为triple789,然后添加triple789 hasValue 5。但是,具有三元组语句的图形与包含三元组的图形不同。但是,听起来你有一个OWL本体,而OWL 确实提供了一种既可以声明声明又可以说出一些声明的方法:annotations

在可以序列化为RDF的OWL中,您可以在类之间建立任意关系作为注释,这不会影响本体的含义,但可以携带可能对其他有用的信息处理工具,或本体的人类读者。此外,其他OWL构造,例如公理,包括​​注释公理,也可以注释。 OWL注释很好,因为它们应该由OWL处理工具保存,并且您不必创建自己的具体化词汇表。

使用注释,您可以将linkedTo定义为注释属性,然后断言(作为注释)FirstClass linkedTo SecondClass。然后,您可以使用另一个注记属性linkValue和对象"5"^^xsd:integer注释注释。这是RDF / XML和N3中的样子。请注意,正如Ian Dickinson在他的回答中所建议的,这种用法仍然包括类之间的直接链接(即,我们有FirstClass linksTo SecondClass),其中使SPARQL查询更容易,特别是当额外的时候价值是没有必要的。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:links="http://www.example.com/links#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://www.example.com/links"/>
  <owl:Class rdf:about="http://www.example.com/links#SecondClass">
    <links:linkedTo>
      <owl:Class rdf:about="http://www.example.com/links#FirstClass"/>
    </links:linkedTo>
  </owl:Class>
  <owl:AnnotationProperty rdf:about="http://www.example.com/links#linkValue"/>
  <owl:Axiom>
    <links:linkValue rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
    >5</links:linkValue>
    <owl:annotatedTarget rdf:resource="http://www.example.com/links#FirstClass"/>
    <owl:annotatedSource rdf:resource="http://www.example.com/links#SecondClass"/>
    <owl:annotatedProperty>
      <owl:AnnotationProperty rdf:about="http://www.example.com/links#linkedTo"/>
    </owl:annotatedProperty>
  </owl:Axiom>
</rdf:RDF>
@prefix :        <http://www.example.com/links#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix links:   <http://www.example.com/links#> .

links:linkedTo
      a       owl:AnnotationProperty .

[]    a       owl:Axiom ;
      links:linkValue 5 ;
      owl:annotatedProperty
              links:linkedTo ;
      owl:annotatedSource links:SecondClass ;
      owl:annotatedTarget links:FirstClass .

links:linkValue
      a       owl:AnnotationProperty .

<http://www.example.com/links>
      a       owl:Ontology .

links:SecondClass
      a       owl:Class ;
      links:linkedTo links:FirstClass .

links:FirstClass
      a       owl:Class .

这样你就可以看到生成的OWL本体的结构(除了它的RDF序列化),这里也是OWL功能语法中的本体:

Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)
Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)

Ontology(<http://www.example.com/links>

Declaration(Class(<http://www.example.com/links#FirstClass>))
Declaration(Class(<http://www.example.com/links#SecondClass>))
AnnotationAssertion(Annotation(<http://www.example.com/links#linkValue> "5"^^xsd:integer) <http://www.example.com/links#linkedTo> <http://www.example.com/links#SecondClass> <http://www.example.com/links#FirstClass>)
Declaration(AnnotationProperty(<http://www.example.com/links#linkValue>))
Declaration(AnnotationProperty(<http://www.example.com/links#linkedTo>))
)