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