如何定义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:myPropertyrdf:Seq元素只是eg:typeOfElement的类型?

(如有必要我可以使用owl。)

可能有多种方法可以实现此目的,具体取决于您的实施偏好。我的建议是使用 rdf:li 特殊 属性 代替任意 rdf:_nnn,这样更容易扩展。 rdf:li依次等同于rdf:_1rdf:_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