List 定义范围为有序列表的属性

List 定义范围为有序列表的属性,list,owl,protege,List,Owl,Protege,给定两个类Container和Element,我想定义一个属性contains,来描述Container的内容 然而,元素的顺序很重要,所以我不能简单地编写 _:container :contains _:element1, _:element2, _:element3 . 如何正确定义contains属性 我已经看过了rdf:List和owl:Seq,但我不知道如何将其转化为我的本体论。您可以根据您的需求和用例以多种方式定义您的属性 首先,有时可以避免完全使用列表或序列,同时保持事物的顺序。

给定两个类
Container
Element
,我想定义一个属性
contains
,来描述
Container
的内容

然而,
元素的顺序很重要,所以我不能简单地编写

_:container :contains _:element1, _:element2, _:element3 .
如何正确定义
contains
属性


我已经看过了
rdf:List
owl:Seq
,但我不知道如何将其转化为我的本体论。

您可以根据您的需求和用例以多种方式定义您的属性

首先,有时可以避免完全使用列表或序列,同时保持事物的顺序。如果要排序的元素具有内在顺序,则可以执行此操作。例如,如果您想从大到小为某人的子女命名,只需使用
hasChild
关系:

ex:someone  onto:hasChild  ex:child3, ex:child1, ex:child2 .
ex:child1  onto:birthDay  "1995-10-25"^xsd:date .
ex:child2  onto:birthDay  "1997-03-10"^xsd:date .
ex:child3  onto:birthDay  "2003-01-14"^xsd:date .
如果您没有确切的日期,也可以使用关系
isOlderThan
来明确订单。然而,这在许多情况下都不起作用。如果你想说出参赛者到达终点线的顺序,你不能说:

ex:runner1  onto:arrivedBefore  ex:runner2 .
# etc.
因为这只适用于这个特殊的种族。一种解决方案是使用如下RDF列表:

ex:race42  onto:arrival  (ex:runner1 ex:runner2 ex:runner3) .
但是,在OWLDL中不能像这样使用RDF列表。在OWL中处理此类列表的典型方式是AKSW在其评论中链接到的文档中描述的内容。也就是说,您可以定义一个类和属性来模拟RDF列表结构:

ex:container42  onto:contains  [
    a  listonto:OWLList;
    listonto:hasElement  ex:element1;
    listonto:hasNext  [
        a  listonto:OWLList;
        listonto:hasElement  ex:element2;
        listonto:hasNext  [
            a  listonto:OWLList;
            listonto:hasElement  ex:element3;
            listonto:hasNext  listonto:emptylist
        ]
    ]
] .
这不是唯一的解决办法。使用
rdf:Seq
也是一种选择(尽管许多人通常不鼓励这样做)。同样,这不能在owldl中使用。但是,可以引入一个本体,部分模仿
rdf:Seq
的工作方式:

ex:container42  onto:contains  [
    a  seqonto:Sequence;
    seqonto:hasSlots
        [ a seqonto:Slot; seqonto:content ex:element1; seqonto:position 1 ],
        [ a seqonto:Slot; seqonto:content ex:element2; seqonto:position 2 ],
        [ a seqonto:Slot; seqonto:content ex:element3; seqonto:position 3 ],
    seqonto:numberOfElements 3
] .
属性
位置
及其编号用于模拟rdf词汇表中的属性
rdf:_1
rdf:_2
,等等。识别最后一个插槽的其他方法可以是一个特殊的
seqon:lastSlot
属性。请注意,这就是


可能还有其他选项,可能与这里讨论的选项一样复杂,但我认为它涵盖了大多数可能性。

您可以根据您的需求和用例以多种方式定义您的属性

首先,有时可以避免完全使用列表或序列,同时保持事物的顺序。如果要排序的元素具有内在顺序,则可以执行此操作。例如,如果您想从大到小为某人的子女命名,只需使用
hasChild
关系:

ex:someone  onto:hasChild  ex:child3, ex:child1, ex:child2 .
ex:child1  onto:birthDay  "1995-10-25"^xsd:date .
ex:child2  onto:birthDay  "1997-03-10"^xsd:date .
ex:child3  onto:birthDay  "2003-01-14"^xsd:date .
如果您没有确切的日期,也可以使用关系
isOlderThan
来明确订单。然而,这在许多情况下都不起作用。如果你想说出参赛者到达终点线的顺序,你不能说:

ex:runner1  onto:arrivedBefore  ex:runner2 .
# etc.
因为这只适用于这个特殊的种族。一种解决方案是使用如下RDF列表:

ex:race42  onto:arrival  (ex:runner1 ex:runner2 ex:runner3) .
但是,在OWLDL中不能像这样使用RDF列表。在OWL中处理此类列表的典型方式是AKSW在其评论中链接到的文档中描述的内容。也就是说,您可以定义一个类和属性来模拟RDF列表结构:

ex:container42  onto:contains  [
    a  listonto:OWLList;
    listonto:hasElement  ex:element1;
    listonto:hasNext  [
        a  listonto:OWLList;
        listonto:hasElement  ex:element2;
        listonto:hasNext  [
            a  listonto:OWLList;
            listonto:hasElement  ex:element3;
            listonto:hasNext  listonto:emptylist
        ]
    ]
] .
这不是唯一的解决办法。使用
rdf:Seq
也是一种选择(尽管许多人通常不鼓励这样做)。同样,这不能在owldl中使用。但是,可以引入一个本体,部分模仿
rdf:Seq
的工作方式:

ex:container42  onto:contains  [
    a  seqonto:Sequence;
    seqonto:hasSlots
        [ a seqonto:Slot; seqonto:content ex:element1; seqonto:position 1 ],
        [ a seqonto:Slot; seqonto:content ex:element2; seqonto:position 2 ],
        [ a seqonto:Slot; seqonto:content ex:element3; seqonto:position 3 ],
    seqonto:numberOfElements 3
] .
属性
位置
及其编号用于模拟rdf词汇表中的属性
rdf:_1
rdf:_2
,等等。识别最后一个插槽的其他方法可以是一个特殊的
seqon:lastSlot
属性。请注意,这就是


可能还有其他的选择,可能和这里讨论的一样,但我认为它涵盖了大多数可能性。

也许你能在本文中找到部分答案:


p.Ciccarese ans S.Peroni,《集合本体论:在OWL 2 DL框架中创建和处理集合》,2013年

也许你能在本文中找到部分答案:


p.Ciccarese ans S.Peroni,《集合本体论:在OWL 2 DL框架中创建和处理集合》,2013

请阅读OWL中的列表。这非常有用。所以我必须在本体中定义我自己的
ElementList
?我不会说“必须”。这只是OWL中对列表建模的一种方法。但是,是的,你可以用同样的方式实现它,或者只是你需要的部分。为了完整性,相应的研究论文提供了更多细节,公理和推理结果列表如下。希望这对你有所帮助,一旦你找到了一个合适的解决方案,请随意在这里分享,以帮助其他人。干杯请阅读OWL中的列表。这非常有用。所以我必须在本体中定义我自己的
ElementList
?我不会说“必须”。这只是OWL中对列表建模的一种方法。但是,是的,你可以用同样的方式实现它,或者只是你需要的部分。为了完整性,相应的研究论文提供了更多细节,公理和推理结果列表如下。希望这对你有所帮助,一旦你找到了一个合适的解决方案,请随意在这里分享,以帮助其他人。谢谢你的回答,它相当全面。你能解释一下为什么不鼓励使用
owl:Seq
吗?它是
rdf:Seq
,而不是
owl:Seq
。它有几个问题。首先,它要求对序列中的每个元素使用不同的属性(
rdf:_1
rdf:_2
,等等),这对编辑和处理(尤其是查询)都很麻烦。其次,没有任何东西强制执行任何规则性,例如以
rdf:_1