каждый раз, когда я начинаю использовать sql, я склонен бросать несколько исследовательских операторов в базу данных для понимания то, что доступно, и что формируется, данные берут.
например.
show tables
describe table
select * from table
кто-либо мог помочь мне понять способ завершить подобное исследование rdf хранилища данных с помощью конечной точки SPARQL?
Спасибо :)
Что ж, очевидное первое начало - это посмотреть на классы и свойства, присутствующие в данных.
Вот как узнать, какие классы используются:
SELECT DISTINCT ?class
WHERE {
?s a ?class .
}
LIMIT 25
OFFSET 0
( LIMIT
и OFFSET
предназначены для разбиения на страницы. К ним стоит привыкнуть, особенно если вы отправляете ваш запрос в Интернете. Я опущу их в других примерах.)
a
- это специальный синтаксис SPARQL (и Notation3 / Turtle ) для представления Предикат rdf: type
- связывает отдельные экземпляры с типами owl: Class
/ rdfs: Class
(примерно эквивалентными таблицам в СУБД SQL).
Во-вторых, вы хотите посмотреть на свойства. Вы можете сделать это, используя классы, которые вы искали, или просто ища свойства. Давайте просто извлечем все свойства из магазина:
SELECT DISTINCT ?property
WHERE {
?s ?property ?o .
}
Это получит все свойства, которые, вероятно, вас не интересуют. Это эквивалентно списку всех столбцов строк в SQL, но без какой-либо группировки по стол.
Более полезно посмотреть, какие свойства используются экземплярами, которые объявляют конкретный класс:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
}
Это вернет вам свойства, используемые в любых экземплярах, удовлетворяющих первой тройке, а именно, которые имеют rdf : введите
из http://xmlns.com/foaf/0.1/Person
.
Помните, поскольку rdf: Resource может иметь несколько свойств rdf: type - классов, если хотите, - и поскольку модель данных RDF является аддитивной, у вас нет проблемы с ромбами.Тип - это просто еще одно свойство - это просто полезное общественное соглашение, чтобы сказать, что некоторые вещи являются людьми, собаками, генами или футбольными командами. Это не означает, что хранилище данных будет содержать свойства, обычно связанные с этим типом. Тип ничего не гарантирует с точки зрения того, какими свойствами может обладать ресурс.
Вам необходимо ознакомиться с моделью данных и использованием синтаксиса SPARQL UNION и OPTIONAL. Грубое отображение rdf: type в таблицы SQL просто грубое.
Возможно, вы захотите узнать, на какой тип объекта указывает свойство. Во-первых, вы, вероятно, захотите узнать о свойствах типов данных - эквивалентных литералам или примитивам. Вы знаете, строки, целые числа и т. Д. RDF определяет эти литералы как все наследуемые от строки. Мы можем отфильтровать только те свойства, которые являются литералами, используя метод фильтра SPARQL isLiteral
:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
FILTER isLiteral(?o)
}
Мы собираемся получить только те свойства, которые имеют в качестве своего объекта литерал - строку, дату и время, логическое значение. , или один из других типов данных XSD.
Но как насчет небуквальных объектов? Рассмотрим это очень простое определение класса псевдо-Java в качестве аналогии:
public class Person {
int age;
Person marriedTo;
}
Используя приведенный выше запрос, мы вернем литерал, который будет представлять возраст, если свойство age связано. Но connectedTo не является примитивом (т.е. буквальным в терминах RDF) - это ссылка на другой объект - в терминологии RDF / OWL это свойство объекта. Но мы не знаем, на какие объекты ссылаются эти свойства (предикаты).Этот запрос вернет вам свойства с соответствующими типами (классы, членами которых являются значения ? O
).
SELECT DISTINCT ?property, ?class
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
?o a ?class .
FILTER(!isLiteral(?o))
}
Этого должно быть достаточно, чтобы ориентироваться в конкретном наборе данных. Конечно, я также рекомендовал бы вам просто выделить отдельные ресурсы и изучить их. Вы можете сделать это с помощью запроса DESCRIBE:
DESCRIBE <http://example.org/resource>
Есть несколько инструментов SPARQL, например SNORQL , которые позволяют делать это в браузере. Экземпляр SNORQL, с которым я связался, содержит образец запроса для исследования возможных именованных графов, которые я здесь не рассматривал.
Если вы не знакомы со SPARQL, честно говоря, лучший ресурс, если вы застряли, - это спецификация. Это спецификация W3C, но довольно хорошая (они создали приличный набор тестов, чтобы вы действительно могли видеть, сделали ли реализации это правильно или нет), и если вы можете преодолеть сложный язык, это очень полезно.
Я часто ссылаюсь на этот список запросов из проекта voiD . Они носят в основном статистический характер, но не только. Не должно быть сложно удалить COUNT из некоторых операторов, чтобы получить фактические значения.