Измерение расстояний между классами на графиках RDF / OWL - PullRequest
6 голосов
/ 25 октября 2011

Может быть, кто-то может дать мне подсказку. Можно ли измерить расстояние между двумя понятиями / классами, принадлежащими к одной и той же онтологии?

Например, предположим, у меня есть онтология с Класс астрономии и класс телескопа. Существует связь между обоими, но это не прямая связь. У астрономии есть родительский класс под названием «Наука», а у «Телескопа» есть родительский класс «Оптический инструмент», который принадлежит своему родительскому классу «Инструментарий» и связан с классом «Эмпирическая наука», который, наконец, принадлежит классу «Наука».

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

Существует ли простой SPARQL-запрос, который решает этот вопрос? Или есть лучшие способы сделать эту работу? Или это невозможно выяснить с помощью парадигмы Semantic Web?

Любой намек будет очень признателен.

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

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

Так что вы можете сделать что-то вроде:

SELECT * WHERE { ?s ex:property+ ?o }

Синтаксис очень похож на регулярное выражение, поэтому вы можете делать альтернативы, ограниченный кардинал и т. Д.

4 голосов
/ 25 октября 2011

В моем понимании SPARQL не содержит никаких рекурсивных конструкций для измерения косвенной ссылки произвольной длины.Лучшее, что вы можете сделать, - это подготовить набор запросов distance_1(a, b), distance_2(a, b) ... для проверки определенного расстояния между двумя понятиями.

Другой альтернативой является обнаружение этой информации с использованием не-SPARQL-технологии, дляпример написания алгоритма обхода графа в Python с помощью RDFlib.

2 голосов
/ 27 октября 2011

Поскольку вы прямо упомянули, что говорите о классах, и они будут в одной и той же онтологии, можно с уверенностью предположить, что они будут всегда связаны (потому что в конечном итоге оба будут подклассом «Вещи», верно?). С другой стороны, путь, который я упомянул в скобках (Class1 -> ... -> Thing <- ... <- Class2), является тривиальным, поэтому я предполагаю, что вы хотите найти ... все существующие пути между двумя классами, другими словами, все существующие пути между двумя вершинами. Это правда? Или вы ищете кратчайший путь? Ваш вопрос не очень ясен в этом аспекте, вы можете уточнить это? </p>

Насколько я знаю, не существует простой конструкции SPARQL, которая бы перечисляла все пути между классами или кратчайший путь. Однако некоторые тройные хранилища семантической сети поставляются с алгоритмами обхода графа, такими как поиск в ширину или поиск в глубину, см.

Вы также можете найти исходный код следующего проекта очень полезным:

...