如何定义rdf中的元素类型:Seq?

时间:2015-05-29 12:42:38

标签: syntax rdf owl rdfs turtle-rdf

我想创建一个属性,将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的类型?

(如果需要,我可以使用猫头鹰。)

1 个答案:

答案 0 :(得分:3)

根据您的实施偏好,可能有多种方法可以实现此目的。我的建议是使用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并优化其域/范围(尽管这些只对人类读者有意义,因为子属性继承了父级的语义) :

: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