可能有多种方法可以实现这一点,具体取决于您的实现偏好。我的建议是使用rdf:li
特殊属性代替rdf:_nnn
更容易扩展的任意属性。rdf:li
等价于rdf:_1
,rdf:_2
按顺序。所以下面的代码块是等价的:
:mySeq a rdf:Seq;
rdf:_1 :foo;
rdf:_2 :bar .
:mySeq a rdf:Seq;
rdf:li :foo;
rdf:li :bar .
请注意,第二个块中的顺序很重要。
为了完成您的要求,您可以扩展rdf:li
一个新属性并优化其域/范围(尽管这些仅对人类读者真正有意义,因为子属性继承了父属性的语义):
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
:myItem
继承 的语义rdf:li
,因此无论您拥有什么实现逻辑,都可以推断出 的值具有:myItem
某种有意义的顺序。接下来:mySeq
通过属性限制定义类:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
它断言这:mySeq
是所有事物的一个类,其中该属性:myItem
显式用于 的值:typeOfElement
。您现在可以使用:mySeq
.
更进一步,您可以将:mySeq
上述规则定义为 与 的交集rdf:Seq
:
:mySeq a owl:Class;
owl:equivalentClass
[ a owl:Class;
owl:intersectionOf
( rdf:Seq
[a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement ]) ] .
注意owl:equivalentClass
代替rdfs:subClassOf
. 如果我们将owl:equivalentClass
其视为对称并由 包含rdfs:subClassOf
,例如:
owl:equivalentClass a owl:SymmetricProperty .
owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf .
那么我们可以有双向的等价性。因此,rdf:Seq
其值为is :myItem
of的所有实例:typeOfElement
也是 的实例:mySeq
。在这种情况下,您正在推断类型。所以通过声明:
:x a rdf:Seq; :myItem :foo, :bar .
你可以推断出来:x a :mySeq
。