исследовательские запросы SPARQL?

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

например.

show tables

describe table

select * from table

кто-либо мог помочь мне понять способ завершить подобное исследование rdf хранилища данных с помощью конечной точки SPARQL?

Спасибо :)

47
задан significance 28 May 2010 в 15:22
поделиться

3 ответа

Что ж, очевидное первое начало - это посмотреть на классы и свойства, присутствующие в данных.

Вот как узнать, какие классы используются:

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, но довольно хорошая (они создали приличный набор тестов, чтобы вы действительно могли видеть, сделали ли реализации это правильно или нет), и если вы можете преодолеть сложный язык, это очень полезно.

81
ответ дан 26 November 2019 в 19:39
поделиться

Я часто ссылаюсь на этот список запросов из проекта voiD . Они носят в основном статистический характер, но не только. Не должно быть сложно удалить COUNT из некоторых операторов, чтобы получить фактические значения.

1
ответ дан 26 November 2019 в 19:39
поделиться
SELECT DISTINCT * WHERE {
  ?s ?p ?o
}
LIMIT 10
2
ответ дан 26 November 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: