2009-09-22 7 views
4

Представьте себе следующую Таксономия (ациклический & ориентированный граф):Получение все предки в РДФ: Класс

<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

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

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

3

1) Не использовали Jena много, но его OntTools класс, кажется, содержит функции для наименьшего общего предка. Если наименее распространенным предком HomoSapiens и млекопитающего является млекопитающее, то HomoSapiens является млекопитающим. Тем не менее, под капотом используется рекурсивный поиск 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

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 снова совершенно правильно, в некоторых случаях, хотя вы могли бы быть в состоянии сделать простой запрос, как следующий, если тройной магазин и связанной с 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

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

ASK { : Homosapiens ИСС: subClassOf +: Млекопитающее }