我想创建一个属性,将rdf:Seq
定义为对象的rdfs:range
:
eg:myProperty a rdf:Property;
rdfs:range rdf:Seq;
.
我正在寻找一种方法来定义rdf:Seq
中存储的元素的类型。例如,我不想要这个:
eg:typeOfElement a rdf:Class;
.
eg:somethingElse a rdf:Class;
.
[] eg:myProperty [
a rdf:Seq;
rdf:_1 [a eg:typeOfElement]; # It's the type I want
rdf:_2 [a eg:typeOfElement]; # It's the type I want
rdf:_3 [a eg:somethingElse]; # I don't want this type
];
.
当我定义rdf:Seq
时,有没有办法定义eg:typeOfElement
元素只是eg:myProperty
的类型?
(如果需要,我可以使用猫头鹰。)
答案 0 :(得分:3)
根据您的实施偏好,可能有多种方法可以实现此目的。我的建议是使用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
的{{1}}值为:myItem
的所有:typeOfElement
实例也是:mySeq
的实例。在这种情况下,您推断的类型。所以通过声明:
:x a rdf:Seq; :myItem :foo, :bar .
你可以推断出:x a :mySeq
。