如何定义rdf:Seq中元素的类型?
How to define the type of elements in an rdf:Seq?
我想创建一个 属性 定义一个 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
];
.
有没有办法定义eg:myProperty
时rdf:Seq
元素只是eg:typeOfElement
的类型?
(如有必要我可以使用owl。)
可能有多种方法可以实现此目的,具体取决于您的实施偏好。我的建议是使用 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
并优化其 domain/range(尽管这些仅对人类读者真正有意义,因为 child 属性 继承了 parent):
的语义
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
:myItem
继承了 rdf:li
的语义,所以无论你有什么实现逻辑,都可以推断出 :myItem
的值是按某种有意义的顺序排列的。接下来通过 属性 限制定义 :mySeq
class:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
断言 :mySeq
是所有事物的 class,其中 属性 :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 .
那么我们就可以得到双向的等价性。因此,:myItem
的值为 :typeOfElement
的所有 rdf:Seq
实例也是 :mySeq
的实例。在这种情况下,您正在推断类型。所以通过语句:
:x a rdf:Seq; :myItem :foo, :bar .
您可以推断出 :x a :mySeq
。
我想创建一个 属性 定义一个 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
];
.
有没有办法定义eg:myProperty
时rdf:Seq
元素只是eg:typeOfElement
的类型?
(如有必要我可以使用owl。)
可能有多种方法可以实现此目的,具体取决于您的实施偏好。我的建议是使用 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
并优化其 domain/range(尽管这些仅对人类读者真正有意义,因为 child 属性 继承了 parent):
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
:myItem
继承了 rdf:li
的语义,所以无论你有什么实现逻辑,都可以推断出 :myItem
的值是按某种有意义的顺序排列的。接下来通过 属性 限制定义 :mySeq
class:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
断言 :mySeq
是所有事物的 class,其中 属性 :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 .
那么我们就可以得到双向的等价性。因此,:myItem
的值为 :typeOfElement
的所有 rdf:Seq
实例也是 :mySeq
的实例。在这种情况下,您正在推断类型。所以通过语句:
:x a rdf:Seq; :myItem :foo, :bar .
您可以推断出 :x a :mySeq
。