2

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

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

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

4

2 回答 2

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 查询更简单.

于 2013-06-20T11:41:13.650 回答
1

正如Ian Dickinson 的回答中提到的,在 RDF 中没有直接的方法可以做到这一点。RDF 确实有一个关于三元组的具体化词汇表,你可以谈论三元组Class1 relatedTo Class2,调用它triple789,然后添加triple789 hasValue 5. 但是,包含关于三元组的语句的图与包含该三元组的图不同。然而,听起来你有一个 OWL 本体,并且 OWL确实提供了一种既可以断言声明又可以说明它的方法: 注解

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

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

<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>))
)
于 2013-06-20T12:24:48.943 回答