Thi*_*and 6 syntax rdf owl rdfs turtle-rdf
我想创建一个定义rdf:Seq作为rdfs:range对象的属性:
eg:myProperty a rdf:Property;
rdfs:range rdf:Seq;
.
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来定义存储在中的元素的类型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
];
.
Run Code Online (Sandbox Code Playgroud)
有没有办法定义rdf:Seq元素只是eg:typeOfElement我定义时的类型eg:myProperty?
(如果需要,我可以使用猫头鹰.)
可能有多种方法可以实现此目的,具体取决于您的实现偏好。我的建议是使用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 .
Run Code Online (Sandbox Code Playgroud)
请注意,第二个块中的顺序很重要。
为了完成您所要求的任务,您可以扩展rdf:li一个新属性并细化其域/范围(尽管这些仅对人类读者真正有意义,因为子属性继承了父属性的语义):
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
Run Code Online (Sandbox Code Playgroud)
:myItem继承了 的语义rdf:li,因此无论您拥有什么实现逻辑,都可以推断 的值:myItem处于某种有意义的顺序。:mySeq接下来通过属性限制定义类:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
Run Code Online (Sandbox Code Playgroud)
它断言这: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 ]) ] .
Run Code Online (Sandbox Code Playgroud)
请注意使用owl:equivalentClass代替rdfs:subClassOf. 如果我们将 视为owl:equivalentClass对称并包含在 中rdfs:subClassOf,例如:
owl:equivalentClass a owl:SymmetricProperty .
owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf .
Run Code Online (Sandbox Code Playgroud)
那么我们就可以得到双向的等价性。rdf:Seq因此,其值为:myItemof的所有实例:typeOfElement也是 的实例:mySeq。在这种情况下,您正在推断类型。所以通过声明:
:x a rdf:Seq; :myItem :foo, :bar .
Run Code Online (Sandbox Code Playgroud)
你可能会这样推断:x a :mySeq。