Протеже: как выразить "не имеет следующего"?

В настоящее время я занимаюсь разработкой онтологии с использованием 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)

1 ответ

Решение

Во-первых, в 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:nil, Это играет ту же роль, что и null указатель в конце связанного списка на языках программирования.

Тем не менее, даже если rdf:List хорошо используется в существующих данных в Интернете, это никоим образом не ограничивает использование предикатов rdf:first а также rdf:restТаким образом, вы можете иметь много первых элементов для данного списка, не вызывая несогласованности.

Итак, если вы действительно хотите смоделировать связанный список, вам нужны довольно выразительные функции OWL. Я сделал это некоторое время назад, и это можно найти на http://purl.org/az/List.

Это нормально, что у вас есть пустой класс, как вы указали, что Node должен иметь nextNode, Вы не должны навязывать, что Узлы имеют контент или следующий элемент. Скорее, вы должны сказать, что количество элементов не превышает 1, что домен и диапазон hasNext это узел, и это EndNode это узел без следующего узла. Но этого все же недостаточно, так как это не означает, что существует EndNode совсем. Вы можете иметь бесконечную последовательность или цикл.

Если вы хотите избежать циклов или бесконечной последовательности, вы должны определить переходное свойство hasFollower и сказать, что есть хотя бы последователь в классе EndNode,

В общем, реализация строгих списков в OWL абсолютно неэффективна и в большинстве случаев бесполезна, поскольку rdf:List достаточно для подавляющего большинства ситуаций.

Другие вопросы по тегам