Что ж, очевидный первый шаг - взглянуть на классы и свойства, присутствующие в данных.
Вот как узнать, какие классы используются:
SELECT DISTINCT ?class
WHERE {
?s a ?class .
}
LIMIT 25
OFFSET 0
(LIMIT
и OFFSET
предназначены для пейджинга. К ним стоит привыкнуть, особенно если вы отправляете запрос через Интернет. Я опущу их в других примерах.)
a
isспециальный синтаксис 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:type
из <a href="http://xmlns.com/foaf/0.1/Person" rel="nofollow noreferrer">http://xmlns.com/foaf/0.1/Person</a>
.
Помните, потому что rdf: Resource может иметь несколько свойств rdf: type - классы, если хотите - и потому что RDF'sмодель данных является аддитивной, у вас нет проблем с бриллиантами.Тип - это просто другое свойство - это просто полезное социальное соглашение о том, что некоторые вещи - это люди, собаки, гены или футбольные команды.Это не означает, что хранилище данных будет содержать свойства, обычно связанные с этим типом.Тип ничего не гарантирует с точки зрения того, какие свойства может иметь ресурс.
Вам необходимо ознакомиться с моделью данных и использованием синтаксиса 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 связано.Но состоящий в браке не является примитивом (т.е. литералом в терминах 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, но довольно хорошая (они создали приличный набор тестов, чтобы вы могли на самом деле увидеть, правильно ли это сделали реализации), и если вы можете преодолеть сложный язык, это очень полезно.