Извлечение всех предков рдф: класс - PullRequest
5 голосов
/ 22 сентября 2009

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

<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 .

Спасибо

Ответы [ 4 ]

4 голосов
/ 22 сентября 2009

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

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

3 голосов
/ 22 сентября 2009

1) Я не использовал Jena много, но его класс OntTools , кажется, содержит функции для самого низкого общего предка. Если наименее распространенным предком HomoSapiens и Mammal является Mammal, то HomoSapiens является Mammal. Под капотом он использует рекурсивный поиск subClassOf, хотя.

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

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
}
2 голосов
/ 22 сентября 2009

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

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

<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 снова полностью верен, но в некоторых случаях вы можете выполнить простой запрос, подобный следующему, если Triple Store и связанная с ним конечная точка 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 }
1 голос
/ 22 ноября 2012

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

ASK { : HomoSapiens rdfs: subClassOf +: Млекопитающее }

...