给出两个类Container
和Element
,我想定义一个属性contains
来描述Container
的内容。
但是,Elements
的顺序很重要,所以我不能简单地写
_:container :contains _:element1, _:element2, _:element3 .
如何正确定义contains
属性?
我看过rdf:List
和owl:Seq
,但是我不知道如何将其转化为本体。
答案 0 :(得分:2)
您可以根据需求和用例的不同以多种方式定义属性。
首先,有时可以避免完全使用列表或序列,但仍保持事物的顺序。如果要订购的元素具有固有顺序,则可以这样做。例如,如果要命名某人的孩子(从大到小),则可以使用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) .
但是,在OWL DL中不能像这样使用RDF列表。 OWSW中处理此类列表的典型方式是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
(尽管很多人通常不建议使用)。同样,这不能在OWL DL中使用。但是,可以引入一种本体,它部分地模仿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
] .
属性position
及其编号用于模仿RDF词汇表中的属性rdf:_1
,rdf:_2
等。标识最后一个插槽的其他方法可以是特殊的seqonto:lastSlot
属性。请注意,ordered list ontology就是这样做的。
也许还有其他选择,可能涉及这里讨论的选择,但我认为它涵盖了大多数可能性。
答案 1 :(得分:1)
也许您可以在本文中找到部分答案:
P。 Ciccarese ans S. Peroni,集合本体论:在OWL 2 DL框架中创建和处理集合,2013 Source