3

我目前正在使用 protege 开发一个本体,并想确定一个节点是否是列表的最后一个。所以基本上一个列表指向一个节点,每个节点都有一些内容并且可以有另一个节点:

List startsWith some Node

Node hasContent some Content

Node hasNext some Node

现在我想定义一个名为EndNode不指向另一个的子类Node。这是我迄今为止尝试过的,但分类后,EndNode总是等于Nothing

Node and not(hasNext some Node)

Node and (hasNext exactly 0 Node)

4

1 回答 1

2

首先,RDF 中有一个内置的 List 结构,您可以通过以下方式使用它:

ex:mylist  rdf:type  rdf:List .
ex:myList  rdf:first  ex:firstElement .
ex:myList  rdf:rest  _:sublist1 .
_:sublist1 rdf:first  ex:SecondElement .
_:sublist1  rdf:rest  rdf:nil .

在这里,为了知道您到达列表的末尾,您需要一个名为 的特殊列表rdf:nilnull这与编程语言中链表末尾的指针所起的作用相同。

但是,即使rdf:List在 Web 上的现有数据中得到了很好的使用,它也不会以任何方式限制谓词的使用rdf:firstand rdf:rest,因此您可以在给定列表中包含许多第一个元素而不会触发不一致。

因此,如果您真的想以严格的方式对链表进行建模,您需要 OWL 的极具表现力的功能。我前一段时间做过,可以在http://purl.org/az/List找到。

你有一个空类是正常的,因为你指定 aNode必须有一个nextNode. 您不应该强加节点具有内容或下一个元素。您应该说基数最大为1,其域和范围hasNext是Node,即EndNode没有下一个节点的节点。但这仍然不够,因为它根本没有强加存在EndNode。您可能有无限序列或循环。

如果要避免循环或无限序列,则必须定义传递属性hasFollower并说类中至少有一个追随者EndNode

总而言之,在 OWL 中实现严格的列表在性能方面完全很糟糕,而且在大多数情况下完全没用,因为rdf:List对于大多数情况来说已经足够了。

于 2012-04-17T14:16:06.697 回答