поисковые SPARQL-запросы? - PullRequest
46 голосов
/ 28 мая 2010

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

например.

show tables

describe table

select * from table

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

Спасибо:)

Ответы [ 4 ]

78 голосов
/ 31 мая 2010

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

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

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

7 голосов
/ 20 апреля 2016

Я считаю полезным следующий набор поисковых запросов:

Просмотр занятий:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
}

Просмотр свойств:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
}

Просмотр свойств данных:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
}

Просмотр того, какие свойства фактически используются:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
}

Просмотр того, какие сущности утверждаются:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
}

Просмотр различных используемых графиков:

select distinct ?g where { 
    graph ?g { 
        ?s ?p ?o 
    } 
}
2 голосов
/ 27 июля 2010
SELECT DISTINCT * WHERE {
  ?s ?p ?o
}
LIMIT 10
1 голос
/ 31 мая 2010

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

...