如果我想说某物的标题应该是一个 rdfs:Literal,我会这样做:
example:title a owl:DatatypeProperty ;
rdfs:range rdfs:Literal .
现在我想表达的是某物有一个有序的标题列表:
example:titles a rdf:List .
我如何指定列表的成员应该是什么?我需要继承 rdf:List 吗?
更新:如果可能,我想继续使用 rdf:List,根据 Joshua 的回答,我认为以下内容说明任何仅具有 rdfs:Literal 值的 rdf:List 都是一个示例:ListOfLiterals,然后我可以使用这是一个范围。
@prefix entity: <http://example.com/stuff/> .
@prefix example: <http://example.com/my/term/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
example:ListOfLiterals a owl:Class ;
owl:equivalentClass [
a owl:Class ;
owl:intersectionOf (
rdf:List
[
a owl:Restriction ;
owl:allValuesFrom rdfs:Literal ;
owl:onProperty rdf:first
]
[
a owl:Restriction ;
owl:allValuesFrom example:ListOfLiterals ;
owl:onProperty rdf:rest
] )
] .
example:Book a owl:Class .
example:titles a owl:DatatypeProperty ;
rdfs:domain example:Book ;
rdfs:range example:ListOfLiterals .
entity:somebook a example:Book ;
example:titles ( "Book Title"@en "Second Book Title"@en ) .
这有意义吗,还是我误解了什么?
最佳答案
首先,请注意,在您的 OWL 代码中使用 rdf:List
意味着您将进入 OWL Full,而许多推理机是为与 OWL DL 一起工作而设计的。你可能对此没有意见,如果你是,那就太好了。如果您需要留在 OWL DL 中,那么您必须使用自己的词汇表来表示列表,例如类 warp:List
和属性 warp:first
和 warp:rest
,并使用它们代替对应的 RDF。
无论如何,一旦你决定了你的 List
类和你的 first
和 rest
属性,你可以定义一个列表类型ListOfElements
只能包含某些类 Element
的成员,但有以下限制:
ElementList ⊑ List and (first only Element) and (rest only ElementList)
这意味着 ElementList
是:(i) List
; (ii) 具有作为 Element
的 first
属性的值; (iii) 有一个 ElementList
作为它的 rest
,这意味着 List
中的其余部分也必须是 Element
无论 nil
对象是什么,都应该已经声明为 List
,但您可能还想包括:
nil a ElementList
但这并不一定那么重要。对于您的情况,您希望以类似的方式定义一个类 TitleList
,然后将您的属性范围声明为 TitleList
。
这是一个示例本体,其中仅包含定义这些类型的 List
类和 ElementList
类(在人类可读的 Turtle 中):
@prefix : <http://stackoverflow.com/a/19480798/1281433/code#> .
@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#> .
:rest a owl:ObjectProperty ;
rdfs:domain :List ;
rdfs:range :List .
:List a owl:Class .
:nil a owl:NamedIndividual , :ElementList , :List .
:ElementList a owl:Class ;
rdfs:subClassOf [ a owl:Class ;
owl:intersectionOf ( :List [ a owl:Restriction ;
owl:allValuesFrom :Element ;
owl:onProperty :first
] [ a owl:Restriction ;
owl:allValuesFrom :ElementList ;
owl:onProperty :rest
] )
] .
:Element a owl:Class .
:first a owl:ObjectProperty ;
rdfs:domain :List .
<http://stackoverflow.com/a/19480798/1281433/code>
a owl:Ontology .
[ a owl:Axiom ;
rdfs:comment "It's probably a good idea to specify that nil is an ElementList. This could also be inferred, though, if there is a nil-terminated List that is known to be an ElementList." ;
owl:annotatedProperty rdf:type ;
owl:annotatedSource :nil ;
owl:annotatedTarget :ElementList
] .
为了完全通用,我定义了一个新的 List
类、first
和 rest
属性,以及一个单独的 nil
,但是如果 OWL Full 适合你,那么你可以只使用 rdf:List
等。为了完整起见,这里是 RDF/XML 中的相同本体:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns="http://stackoverflow.com/a/19480798/1281433/code#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://stackoverflow.com/a/19480798/1281433/code"/>
<owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#List"/>
<owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#ElementList">
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#List"/>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#first"/>
</owl:onProperty>
<owl:allValuesFrom>
<owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#Element"/>
</owl:allValuesFrom>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#rest"/>
</owl:onProperty>
<owl:allValuesFrom rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
<owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#rest">
<rdfs:range rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
<rdfs:domain rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#first">
<rdfs:domain rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
</owl:ObjectProperty>
<owl:Axiom>
<rdfs:comment>It's probably a good idea to specify that nil is an ElementList. This could also be inferred, though, if there is a nil-terminated List that is known to be an ElementList.</rdfs:comment>
<owl:annotatedTarget rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
<owl:annotatedSource>
<owl:NamedIndividual rdf:about="http://stackoverflow.com/a/19480798/1281433/code#nil">
<rdf:type rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
<rdf:type rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
</owl:NamedIndividual>
</owl:annotatedSource>
<owl:annotatedProperty rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"/>
</owl:Axiom>
</rdf:RDF>
关于rdf - 我可以为 rdf :List members? 指定范围吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474738/