我希望能够自动为连接我的本体中两个类的链接分配一个值。只有两个值要分配给链接;也就是说,如果链接来自与链接终止的类相比,连接到它的子类数量较少的类,则链接将被分配值 1,如果链接来自具有更多的类,则分配值 5连接到它的子类的数量,如果所有类的子类数量相同,则链接将被赋值为 5。
我可以在 Jena 中加载我的本体,并在我的本体中列出每个类的所有子类和超类。
这将帮助我使用任何算法遍历我的 RDF 图。
除了它们已经拥有的谓词 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 查询更简单.
正如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:integer
FirstClass 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>))
)