Вопрос

Представьте себе следующую таксономию (ациклический и ориентированный граф):

<my:Eukaryota> <rdfs:subClassOf> <my:Organism>.
<my:Mammal> <rdfs:subClassOf> <my:Eukaryota>.
<my:Primate> <rdfs:subClassOf> <my:Mammal>.
<my:HomoSapiens> <rdfs:subClassOf> <my:Primate>.
<my:Bacteria> <rdfs:subClassOf> <my:Organism>.
<my:Escherichia> <rdfs:subClassOf> <my:Bacteria>.

1) Возможно ли это с помощью Jena OWL API ( Йенская СОВА ) чтобы проверить, является ли данный ресурс (напримерHomoSapiens) является подклассом 'Mammal' без рекурсивного извлечения всех родительских узлов?

2) Тот же вопрос с SPARQL - ФАЙЛ.

Спасибо

Это было полезно?

Решение

Если вы уже используете Jena, вы можете использовать use Pellet's Механизм запросов SPARQL-DL, что должно позволить вам запрашивать отдельных пользователей способом, учитывающим онтологию.

В качестве альтернативы, вы можете использовать Jena InfModel вместо того , чтобы Model интерфейс, прикрепите к нему средство аргументации (и онтологию), а затем запустите запрос, о котором упоминает RobV.Вы можете использовать Рассуждатель Пеллета для этого, если бы вы захотели.Вам не нужно использовать OntModel если вы просто хотите порассуждать.

Другие советы

1) Не часто пользовался Jena, но его Онтоинструменты класс, по-видимому, содержит функции для наименьшего общего предка.Если наименее общим предком HomoSapiens и Млекопитающего является Mammal, то HomoSapiens - это Млекопитающее.Однако под капотом он использует рекурсивный подкласс извлечения.

2) В общем случае нет, SPARQL не поддерживает обход дерева произвольной глубины.Но если вы знаете максимальную глубину дерева подклассов, то вы можете сконструировать запрос типа

ASK {
  OPTIONAL {
    :HomoSapiens rdfs:subClassOf :Mammal
  }
  OPTIONAL {
    :HomoSapiens rdfs:subClassOf ?c .
    ?c rdfs:subClassOf :Mammal
  }
  OPTIONAL {
    :HomoSapiens rdfs:subClassOf ?c1 .
    ?c1 rdfs:subClassOf ?c2 .
    ?c2 rdfs:subClassOf :Mammal
  }

  # ... add
}

лаалто прав, практически любая семантическая веб-библиотека собирается делать это с помощью рекурсивного поиска подклассов.Единственный способ обойти это - иметь некоторый механизм вывода / рассуждения, который добавлял бы дополнительные тройки к графику по мере анализа исходного графика

Так, например, это автоматически добавило бы следующее:

<my:Eukaryota> <rdf:type> <my:Organism>.
<my:Mammal> <rdf:type> <my:Organism>.
<my:Mammal> <rdf:type> <my:Eukaryota>.
<my:Primate> <rdfs:type> <my:Organism>.
<my:Primate> <rdfs:type> <my:Eukaryota>.
<my:Primate> <rdfs:type> <my:Mammal>.
# etc...

Как вы делаете это в Йене, я не уверен, кто-то другой, кто знает Йену, должен был бы ответить на этот вопрос.

Что касается SPARQL, laalto снова полностью корректен, хотя в некоторых случаях вы могли бы выполнить простой запрос, подобный следующему, если Тройное хранилище и связанная с ним конечная точка SPARQL, которую вы запрашиваете, обладают некоторыми возможностями вывода

PREFIX my: <http://yournamespace.com>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ASK { my:HomoSapiens rdf:type my:Mammal }

SPARQL 1.1 имеет произвольный обход графика глубины.Который может быть использован для этого.Смотрите соответствующий вопрос по адресу БиоСтар

СПРОСИТЕ { :HomoSapiens rdfs:подкласс+ :Млекопитающее }

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top