8

我想创建一个将 a 定义rdf:Seqrdfs: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

(如有必要,我可以使用猫头鹰。)

4

1 回答 1

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其值为is :myItemof的所有实例:typeOfElement也是 的实例:mySeq。在这种情况下,您正在推断类型。所以通过声明:

:x a rdf:Seq; :myItem :foo, :bar .

你可以推断出来:x a :mySeq

于 2015-06-02T13:21:18.050 回答