Title: SPARQL Tutorial - Datasets Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at . http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Essa sessão cobre datasets RDF – um dataset RDF é a unidade consultada por um consulta SPARQL. Ele consiste de um grafo padrão, e certo número de grafos nomeados. ## Consultando datasets As operações de casamento de grafos ([padrões básicos](sparql_basic_patterns_pt.html), [`OPTIONAL`s](sparql_optionals_pt.html), e [`UNION`s](sparql_union_pt.html)) funcionam em um grafo RDF. Isso começa por ser o grafo padrão do conjunto de dados, mas pode ser alterado pela palavra-chave `GRAPH`. GRAPH uri { ... padrão ... } GRAPH var { ... padrão ... } Se um URI é fornecido, o padrão vai ser casado contra o grafo no dataset com esse nome – se não houver um, então clausula `GRAPH` falhará ao tentar casar. Se uma variável é dada, todos os grafos nomeados (não o grafo padrão) são testados. A variavel pode ser usada em outro lugar, então, durante a execução, esse valor já é conhecido para a solução, somente o grafo nomeado é testado. ### Dados de exemplo Um dataset RDF pode ter várias formas. A instalação comum é ter o grafo padrão sendo a união (o merge RDF) de todos os grafos nomeados e ter o grafo padrão como um inventário de grafos nomeados (de onde eles vieram, quando eles foram lidos, etc.). Não há limitações – um grafo pode ser incluído duas vezes sob diferentes nomes, ou alguns grafos podem compartilhar triplas com outros. Nos exemplos abaixo, vamos usar o seguinte dataset que pode ocorrer para um RDF agregador de um livro de detalhes: Grafo padrão ([ds-dft.ttl](sparql_data/ds-dft.ttl)): @prefix dc: . @prefix xsd: . dc:date "2005-07-14T03:18:56+0100"^^xsd:dateTime . dc:date "2005-09-22T05:53:05+0100"^^xsd:dateTime . Grafo nomeado ([ds-ng-1.ttl](sparql_data/ds-ng-1.ttl)): @prefix dc: . [] dc:title "Harry Potter and the Philospher's Stone" . [] dc:title "Harry Potter and the Chamber of Secrets" . Grafo nomeado ([ds-ng-2.ttl](sparql_data/ds-ng-2.ttl)): @prefix dc: . [] dc:title "Harry Potter and the Sorcerer's Stone" . [] dc:title "Harry Potter and the Chamber of Secrets" . Isto é, nós temos dois pequenos grafos descrevendo alguns livros, e nós temos um grafo padrão que armazena quando esses grafos foram lidos pela última vez. As consultas podem ser executadas via linha de comando (tudo numa linha): java -cp ... arq.sparql --graph ds-dft.ttl --namedgraph ds-ng-1.ttl --namedgraph ds-ng-2.ttl --query query file Datasets não têm que ser criados só para o tempo de vida da consulta. Eles podem ser criados e armazenados num banco de dados, o que seria mais usual para uma aplicação agregadora. ### Acessando o Dataset O primeiro exemplo apenas acessa o grafo padrão: ([q-ds-1.rq](sparql_data/q-ds-1.rq)): PREFIX xsd: PREFIX dc: PREFIX : <.> SELECT * { ?s ?p ?o } (O "`PREFIX : <.>`"  apenas ajuda a formatar a saída) ---------------------------------------------------------------------- | s | p | o | ====================================================================== | :ds-ng-2.ttl | dc:date | "2005-09-22T05:53:05+01:00"^^xsd:dateTime | | :ds-ng-1.ttl | dc:date | "2005-07-14T03:18:56+01:00"^^xsd:dateTime | ---------------------------------------------------------------------- Este é somente o grafo padrão – nada dos grafos nomeados porque eles não são consultados a menos que seja informado explicitamente via `GRAPH`. Nós podemos consultar todas as triplas ao consultar o grafo padrão e os grafos nomeados: ([q-ds-2.rq](sparql_data/q-ds-2.rq)): PREFIX xsd: PREFIX dc: PREFIX : <.> SELECT * { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } } resultando em: --------------------------------------------------------------------------------------- | s | p | o | g | ======================================================================================= | :ds-ng-2.ttl | dc:date | "2005-09-22T05:53:05+01:00"^^xsd:dateTime | | | :ds-ng-1.ttl | dc:date | "2005-07-14T03:18:56+01:00"^^xsd:dateTime | | | _:b0 | dc:title | "Harry Potter and the Sorcerer's Stone" | :ds-ng-2.ttl | | _:b1 | dc:title | "Harry Potter and the Chamber of Secrets" | :ds-ng-2.ttl | | _:b2 | dc:title | "Harry Potter and the Chamber of Secrets" | :ds-ng-1.ttl | | _:b3 | dc:title | "Harry Potter and the Philospher's Stone" | :ds-ng-1.ttl | --------------------------------------------------------------------------------------- ### Consultando um grafo especifico Se a aplicação souber o nome do grafo, ele pode consultar diretamente títulos num grafo dado: ([q-ds-3.rq](sparql_data/q-ds-3.rq)): PREFIX dc: PREFIX : <.> SELECT ?title { GRAPH :ds-ng-2.ttl { ?b dc:title ?title } } Resultados: --------------------------------------------- | title | ============================================= | "Harry Potter and the Sorcerer's Stone" | | "Harry Potter and the Chamber of Secrets" | --------------------------------------------- ### Consulta para encontrar dados de grafos que casam com um padrão O nome dos grafos a ser consultados podem ser determinados na consulta. O mesmo processo se aplica a variáveis se elas são parte de um padrão de grafo ou na forma `GRAPH` form. A consulta abaixo ([q-ds-4.rq](sparql_data/q-ds-4.rq)) seta uma condição nas variáveis usadas para selecionar grafos nomeados, baseada na informação do grafo padrão. PREFIX xsd: PREFIX dc: PREFIX : <.> SELECT ?date ?title { ?g dc:date ?date . FILTER (?date > "2005-08-01T00:00:00Z"^^xsd:dateTime ) GRAPH ?g { ?b dc:title ?title } } O resultado da consulta no dataset de exemplo são títulos em um dos grafos, o grafo com data anterior a 1 de agosto de 2005. ----------------------------------------------------------------------------------------- | date | title | ========================================================================================= | "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Sorcerer's Stone" | | "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Chamber of Secrets" | ----------------------------------------------------------------------------------------- ## Descrevendo datasets RDF - `FROM` e `FROM NAMED` À execução de um consulta pode ser dado o dataset quando o objeto da execução é construído ou ele pode ser descrito na própria consulta. Quando os detalhes estão na linha de comando, um dataset temporário é criado, mas uma aplicação pode criar datasets e então usá-los em várias consultas. Quando descrito na consulta, `FROM url` é usado para identificar o conteúdo a preencher o grafo padrão. Pode haver mais de uma clausula `FROM` e o grafo padrão é resultado da leitura de cada arquivo no grafo padrão. Isto é o merge de RDF de grafos individuais. Não se confunda com o fato de um grafo padrão ser descrito por uma ou mais URL na clausula `FROM`. Esse é o lugar de onde o dado é lito, não o nome do grafo. Como muitas clausulas FROM podem ser fornecidas, o dado pode ser lido de vários lugares, mas nenhum deles se torna o nome do grafo. `FROM NAMED url` é usado para identificar o grafo nomeado. Ao grafo é dado a url e o dado é lido daquela localização. Múltiplas clausulas `FROM NAMED` causam em muitos grafos para serem adicionados ao dataset. Observe que os grafos são carregados com Jena FileManager que inclui a habilidade de prover localizações alternativas para os arquivos. Por exemplo, a consulta pode ter `FROM NAMED `, e o dado ser lido de `file:local.rdf`. O nome do grafo vai ser como na consulta. Por exemplo, a consulta para buscar todas as triplas em ambos o grafo padrão e os grafos nomeados poderia ser escrita como ([q-ds-5.rq](sparql_data/q-ds-5.rq)): PREFIX xsd: PREFIX dc: PREFIX : <.> SELECT * FROM FROM NAMED FROM NAMED { { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } } } [Next: Resultados](sparql_results_pt.html)