Протеже: как выразить "не имеет следующего"?
В настоящее время я занимаюсь разработкой онтологии с использованием 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
достаточно для подавляющего большинства ситуаций.