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