Clone URL (Committers only):
https://cms.apache.org/redirect?new=anonymous;action=diff;uri=http://jena.apache.org/tutorials%2Frdf_api_pt.mdtext

Guilherme Cavalcanti

This is the first of the portuguese translation of tutorials.

Thanks.

Index: trunk/content/tutorials/rdf_api_pt.mdtext
===================================================================
--- trunk/content/tutorials/rdf_api_pt.mdtext   (revision 0)
+++ trunk/content/tutorials/rdf_api_pt.mdtext   (working copy)
@@ -0,0 +1,937 @@
+Title: Uma Introdução a RDF e à API RDF de Jena
+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.
+
+<h2>Prefácio</h2>
+
+Este é um tutorial introdutório ao framework de descrição de recursos (RDF)
+e Jena, uma API Java para RDF. Ele é escrito para programadores que 
+não estão familiarizados com RDF e que aprendem melhor através de 
prototipagem, 
+ou, por outros motivos, desejam avançar rapidamente para a implementação. 
+Familiaridade com XML e Java é assumido.
+
+<p>Avançar direto para a implementação, sem conhecer inicialmente o modelo de 
dados de RDF, 
+levará à frustração e ao desapontamento. No entanto, estudar unicamente o 
modelo de dados é 
+desgastante e muitas vezes leva a "enigmas metafísicos torturantes". É melhor, 
+então, abordar os conceitos do modelo de dados e como usá-lo, paralelamente. 
+Aprender um pouco o modelo de dados, e praticá-lo. Então aprender um pouco 
mais e praticar. 
+A teoria leva à prática , e a prática leva à teoria. O modelo de dados é 
+relativamente simples, então esta abordagem não exigirá muito tempo.</p>
+
+<p>RDF possui uma sintaxe XML, e muitos dos que são familiarizados com XML 
irão pensar em RDF em termos da sintaxe do XML. Isso é um erro. RDF deve ser 
entendido em termos do seu modelo de dados. Os dados RDF podem ser 
representados em XML, mas entender a sintaxe é menos importante do que entender 
o modelo de dados.</p>
+
+<p>Uma implementação da API JENA, incluindo o código fonte dos exemplos usados 
neste tutorial, podem ser baixados em  
+<a 
href="http://jena.apache.org/download/";><code>jena.apache.org/download/</code></a>.</p>
+
+<p></p>
+
+<h2>Conteúdo</h2>
+<ol>
+  <li><a href="#ch-Introduction">Introdução</a></li>
+  <li><a href="#ch-Statements">Sentenças</a></li>
+  <li><a href="#ch-Writing RDF">Escrita de RDF</a></li>
+  <li><a href="#ch-Reading RDF">Leitura de RDF</a></li>
+  <li><a href="#ch-Prefixes">Controle de Prefixos</a></li>
+  <li><a href="#ch-Jena RDF Packages">Pacotes de Jena RDF</a></li>
+  <li><a href="#ch-Navigating a Model">Navegação em Modelos</a></li>
+  <li><a href="#ch-Querying a Model">Consulta de Modelos</a></li>
+  <li><a href="#ch-Operations on Models">Operações em Modelos</a></li>
+  <li><a href="#ch-Containers">Containers</a></li>
+  <li><a href="#ch-More about Literals and Datatypes">Mais sobre Literais e 
Datatypes</a></li>
+  <li><a href="#ch-Glossary">Glossário</a></li>
+</ol>
+
+<h2><a id="ch-Introduction">Introdução</a></h2>
+
+<p> O framework de descrição de recursos (RDF) é um padrão (tecnicamente uma 
recomendação da W3C) para descrever recursos. Mas o que são recursos? Isso é 
uma questão profunda e a definição precisa ainda é um assunto de debates. Para 
nossos propósitos, nós podemos pensar em recursos como tudo que podemos 
identificar. Você é um recurso, assim como sua página pessoal, este tutorial, o 
número um e a grande baleia branca em Moby Dick.</p>
+
+<p>Nossos exemplos neste tutorial serão sobre pessoas.  Elas usam uma <a
+href="http://www.w3.org/TR/vcard-rdf";>representação RDF de cartão de negócios 
(VCARDS)</a>. RDF é melhor representado como um diagrama de nós e arcos. Um 
simples vcard se assemelha a isto em RDF:</p>
+
+<p align="center">
+<img border="0" src="figures/fig1.png" alt="figure 1" width="240" 
height="180"></p>
+
+<p>O <a href="#glos-Resource"><i>recurso</i></a>, John Smith, é exibido como 
uma elipse e identificado por um Identificador Uniforme de Recurso (URI)<font
+size="1"><sup><a href="#fn-01">1</a></sup></font>,  neste caso
+"http://.../JohnSmith";. Se você tentar acessar o recurso usando seu navegador, 
não vai obter sucesso. Se você não tem familiaridade com URI's, pense neles 
como nomes estranhos.</p>
+
+<p>Recursos possuem <a href="#glos-Property"><i>propriedades</i></a>.  Nesses 
exemplos, nós estamos interessados nos tipos de propriedades que apareceriam no 
cartão de negócios de Jonh Smith. A figura 1 mostra somente  uma propriedade, o 
nome completo (full name) de Jonh Smith. Uma propriedade é representada por um 
arco, intitulado com o nome da propriedade. O nome da propriedade é também um 
URI, mas como os URIs são longos e incomodas, o diagrama o exibe em forma XML 
qname. A parte antes de  ':' é chamada de prefixo namespace e representa um 
namespace. A parte depois de ':' é um nome local e representa o nome naquele 
namespace. Propriedades são normalmente representadas nesta forma de qname 
quando escrito como RDF XML, e isso é uma maneira prática de representá-los em 
diagramas e textos. No entanto, propriedades são rigorosamente representadas 
por um URI. A forma nsprefix:localname  é um atalho para o URI do namespace 
concatenado com o nome local. Não há exigência
 s de que o URI de uma propriedade resulte em algo quando acessado do 
navegador.</p>
+
+<p>Toda propriedade possui um valor. Neste caso, o valor é uma <a
+href="#glos-Literal"><i>literal</i></a>, que por hora podemos pensar nelas 
como uma cadeia de caracteres<font size="1"><sup><a 
href="#fn-02">2</a></sup></font>.
+Literais são exibidas em retângulos.</p>
+
+<p>Jena é uma API Java que pode ser usada para pra criar e manipular grafos 
RDF como o apresentado no exemplo. Jena possui classes para representar grafos, 
recursos, propriedades e literais. As interfaces que representam recursos, 
propriedades e literais são chamadas de modelo e é representada pela interface 
Model.</p>
+
+<p>O código para criar este grafo, ou modelo, é simples:</p>
+
+<blockquote>
+  <pre><code>// some definitions
+static String personURI    = "http://somewhere/JohnSmith";;
+static String fullName     = "John Smith";
+
+// create an empty Model
+Model model = ModelFactory.createDefaultModel();
+
+// create the resource
+Resource johnSmith = model.createResource(personURI);
+
+// add the property
+ johnSmith.addProperty(VCARD.FN, fullName);</code></pre>
+</blockquote>
+
+<p>Ele começa com algumas definições de constantes e então cria um Model 
vazio, usando o método <code>createDefaultModel()</code> de 
<code>ModelFactory</code>
+para criar um modelo na memória. Jena possui outras implementações da 
interface Model, e.g. uma que usa banco de dados relacionais: esses tipos de 
modelo são também disponibilizados a partir de ModelFactory.</p>
+
+<p>O recurso Jonh Smith é então criado, e uma propriedade é adicionada a ele. 
A propriedade é fornecida pela a classe "constante"  VCARD, que mantém os 
objetos que representam todas as definições no esquema de VCARD. Jena provê 
classes constantes para outros esquemas bem conhecidos, bem como os próprios 
RDF e RDFs , Dublin Core e OWL.</p>
+
+<p>O código para criar o recurso e adicionar a propriedade pode ser escrito de 
forma mais compacta usando um estilo cascata:</p>
+
+<blockquote>
+  <pre><code>Resource johnSmith =
+        model.createResource(personURI)
+             .addProperty(VCARD.FN, fullName);</code></pre>
+</blockquote>
+
+<p>Os códigos desse exemplo podem ser encontrados no diretório /src-examples 
no pacote de distribuição do Jena como <a 
href="../../../src-examples/jena/examples/rdf/Tutorial01.java">tutorial 1</a>. 
Como exercício, pegue este código e modifique-o para criar um próprio VCARD 
para você.</p>
+
+<p>Agora vamos adicionar mais detalhes ao vcard, explorando mais recursos de 
RDF e Jena.</p>
+
+<p>No primeiro exemplo, o valor da propriedade foi um número. As propriedades 
RDF podem também assumir outros recursos como valor. Usando uma técnica comum 
em RDF, este exemplo mostra como representar diferentes partes do nome de Jonh 
Smith:</p>
+
+<p align="center">
+<img border="0" src="figures/fig2.png" alt="figure 2" width="360" 
height="240"></p>
+
+<p>Aqui, nós adicionamos uma nova propriedade, vcard:N, para representar a 
estrutura do nome de Jonh Smith. Há muitas coisas interessantes sobre este 
modelo. Note que a propriedade vcard:N usa um recurso como seu valor. Note 
também que a elipse que representa a composição do nome não possui URI. Isso é 
conhecido como <i><a href="#glos-blank node">blank Node</a>.</i></p>
+
+<p>O código Jena para construir este exemplo é, novamente, muito simples. 
Primeiro algumas declarações e a criação do modelo vazio.</p>
+
+<blockquote>
+  <pre><code>// some definitions
+String personURI    = "http://somewhere/JohnSmith";;
+String givenName    = "John";
+String familyName   = "Smith";
+String fullName     = givenName + " " + familyName;
+
+// create an empty Model
+Model model = ModelFactory.createDefaultModel();
+
+// create the resource
+//   and add the properties cascading style
+Resource johnSmith
+  = model.createResource(personURI)
+         .addProperty(VCARD.FN, fullName)
+         .addProperty(VCARD.N,
+                      model.createResource()
+                           .addProperty(VCARD.Given, givenName)
+                           .addProperty(VCARD.Family, 
familyName));</code></pre>
+</blockquote>
+
+<p>Os códigos desse exemplo podem ser encontrados no diretório /src-examples 
no pacote de distribuição do Jena como <a 
href="../../../src-examples/jena/examples/rdf/Tutorial02.java">tutorial 
2</a>.</p>
+
+<h2><a id="ch-Statements">Sentenças</a></h2>
+
+<p>Cada arco no modelo RDF é chamado de <i><a
+href="#glos-Statement">sentença</a></i>. Cada sentença define um fato sobre o 
recurso. Uma sentença possui três partes:</p>
+<ul>
+  <li>o <i><a href="#glos-Subject"> sujeito</a></i> é o recurso de onde o arco 
começa.</li>
+  <li>o <i><a href="#glos-Predicate"> predicado</a></i> é a propriedade que 
nomeia o arco.</li>
+  <li>o <i><a href="#glos-Object"> objeto</a></i> é o recurso ou literal 
apontado pelo arco.</li>
+</ul>
+
+<p>Uma sentença é algumas vezes chamadas de <a href="#glos-Triple">tripla</a>,
+por causa de suas três partes.</p>
+
+<p>Um modelo RDF é representado como um <i>conjunto </i> de sentenças. Cada 
chamada a 
+<code>addProperty</code> no tutorial2 adiciona uma nova sentença. (Já que um 
modelo é um conjunto de sentenças, adicionar sentenças duplicadas não afeta em 
nada). A interface modelo de Jena define o método  
<code>listStatements()</code> que retorna um <code>StmtIterator</code>, um 
subtipo de 
+<code>Iterator</code> Java sobre todas as sentenças de um modelo.
+<code>StmtIterator</code> possui o método <code>nextStatement()</code>
+que retorna a próxima sentença do iterador (o mesmo que <code>next()</code> 
faz, já convertido para  <code>Statement</code>). A interface 
<code>Statement</code> provê métodos de acesso ao sujeito, predicado e objeto 
de uma sentença.</p>
+
+<p>Agora vamos usar essa interface para estender tutorial2 para listar todas 
as sentenças criadas e imprimi-las. O código completo deste exemplo pode ser 
encontrado em <a 
href="../../../src-examples/jena/examples/rdf/Tutorial03.java">tutorial 
3</a>.</p>
+
+<blockquote>
+<pre><code>// list the statements in the Model
+StmtIterator iter = model.listStatements();
+
+// print out the predicate, subject and object of each statement
+while (iter.hasNext()) {
+    Statement stmt      = iter.nextStatement();  // get next statement
+    Resource  subject   = stmt.getSubject();     // get the subject
+    Property  predicate = stmt.getPredicate();   // get the predicate
+    RDFNode   object    = stmt.getObject();      // get the object
+
+    System.out.print(subject.toString());
+    System.out.print(" " + predicate.toString() + " ");
+    if (object instanceof Resource) {
+       System.out.print(object.toString());
+    } else {
+        // object is a literal
+        System.out.print(" \"" + object.toString() + "\"");
+    }
+
+    System.out.println(" .");
+} </code></pre>
+</blockquote>
+
+<p>Já que o objeto de uma sentença pode ser tanto um recurso quanto uma 
literal, o método 
+<code>getObject()</code> retorna um objeto do tipo <code>RDFNode</code>, que é 
uma superclasse comum de ambos <code>Resource</code> e <code>Literal</code>. O 
objeto em si é do tipo apropriado, então o código usa <code>instanceof</code> 
para determinar qual e processá-lo de acordo.</p>
+
+<p>Quando executado, o programa deve produzir a saída:</p>
+<pre><code>http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#N 
anon:14df86:ecc3dee17b:-7fff .
+anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Family  
"Smith" .
+anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Given  
"John" .
+http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#FN  "John 
Smith" .</code></pre>
+
+<p></p>
+
+<p>Agora você sabe o porquê de ser simples elaborar modelos. Se você olhar 
atentamente, você perceberá que cada linha consiste de três campos 
representando o sujeito, predicado e objeto de cada sentença. Há quatro arcos 
no nosso modelo, então há quatro sentenças. O "anon:14df86:ecc3dee17b:-7fff" é 
um identificador interno gerado pelo Jena. Não é uma URI e não deve ser 
confundido como tal. É simplesmente um nome interno usado pela implementação do 
Jena.</p>
+
+<p>O W3C <a href="http://www.w3.org/2001/sw/RDFCore/";>RDFCore Working
+Group</a> definiu uma notação similar chamada <a 
href="http://www.w3.org/TR/rdf-testcases/#ntriples";>N-Triples</a>. O nome 
significa "notação de triplas". Nós veremos na próxima sessão que o Jena possui 
uma interface de escrita de N-Triples também.</p>
+
+<h2><a id="ch-Writing RDF">Escrita de RDF</a></h2>
+
+<p>Jena possui métodos para ler e escrever RDF como XML. Eles podem ser usados 
para armazenar o modelo RDF em um arquivo e carregá-lo novamente em outro 
momento.</p>
+
+<p>O Tutorial 3 criou um modelo e o escreveu no formato de triplas. <a
+href="../../../src-examples/jena/examples/rdf/Tutorial04.java">Tutorial 4</a> 
modifica o tutorial 3 para escrever o modelo na forma de RDF XML numa stream de 
saída. O código, novamente, é muito simples: <code>model.write</code> pode 
receber um  <code>OutputStream</code> como argumento.</p>
+
+<blockquote>
+  <pre><code>// now write the model in XML form to a file
+model.write(System.out);</code></pre>
+</blockquote>
+
+<p>A saída deve parecer com isso:</p>
+
+<blockquote>
+  <pre><code>&lt;rdf:RDF
+  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+  xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
+ &gt;
+  &lt;rdf:Description rdf:about='http://somewhere/JohnSmith'&gt;
+    &lt;vcard:FN&gt;John Smith&lt;/vcard:FN&gt;
+    &lt;vcard:N rdf:nodeID=&quot;A0&quot;/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A0&quot;&gt;
+    &lt;vcard:Given&gt;John&lt;/vcard:Given&gt;
+    &lt;vcard:Family&gt;Smith&lt;/vcard:Family&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;</code></pre>
+</blockquote>
+
+<p></p>
+
+<p>As especificações de RDF especificam como representar RDF como XML. A 
sintaxe de RDF XML é bastante complexa. Recomendamos ao leitor dar uma olhada 
no <a href="http://www.w3.org/TR/rdf-primer/";>primer</a>  sendo desenvolvido 
pelo RDFCore WG para uma introdução mais detalhada. Entretanto, vamos dar uma 
olhada rápida em como interpretar a saída acima.</p>
+
+<p>RDF é normalmente encapsulada num elemento &lt;rdf:RDF&gt;. O elemento é 
opcional se houver outras maneiras de saber se aquele XML é RDF, mas 
normalmente ele é presente. O elemento RDF define os dois namespaces usados no 
documento. Há um elemento  &lt;rdf:Description&gt; que descreve o recurso cuja 
URI é "http://somewhere/JohnSmith";. Se o atributo rdf:about estivesse ausente, 
esse elemento representaria um blank node.</p>
+
+<p>O elemento &lt;vcard:FN&gt; descreve uma propriedade do recurso. O nome da 
propriedade é o "FN" no namespace do vcard. RDF o converte para uma referência 
URI concatenando a referência URI do prefixo presente no namespace de vcard e 
"FN", o nome local parte do nome. Isto nos dá a referência URI " 
http://www.w3.org/2001/vcard-rdf/3.0#FN";. O valor da propriedade é a literal 
"Jonh Smith".</p>
+
+<p>O elemento &lt;vcard:N&gt; é um recurso. Neste caso, o recurso é 
representado por uma referência URI relativa. RDF o converte para uma 
referência URI absoluta concatenando com o URI base do documento.</p>
+
+<p>Há um erro nesse RDF XML: ele não representa exatamente o modelo que 
criamos. Foi dado uma URI ao blank node do modelo. Ele não é mais um blank node 
portanto. A sintaxe RDF/XML não é capaz de representar todos os modelos RDF; 
por exemplo, ela não pode representar um blank node que é o objeto de duas 
sentenças. O escritor que usamos para escrever este RDF/XML não é capaz de 
escrever corretamente o subconjunto de modelos que podem ser escritos 
corretamente. Ele dá uma URI a cada blank node, tornando-o não mais blank.</p>
+
+<p>Jena possui uma interface extensível que permite novos escritores para 
diferentes linguagens de serialização RDF. Jena possuem também um escritor 
RDF/XML mais sofisticado que pode ser invocado ao especificar outro argumento à 
chamada de método 
+<code>write()</code>:</p>
+
+<blockquote>
+  <pre><code>// now write the model in XML form to a file
+model.write(System.out, "RDF/XML-ABBREV");
+ </code></pre>
+</blockquote>
+
+<p>Este escritor, chamado também de PrettyWriter, ganha vantagem ao usar as 
particularidades da sintaxe abreviada de RDF/XML ao criar um modelo mais 
compacto. Ele também é capaz de preservar os blank nodes onde é possível. 
Entretanto, não é recomendável para escrever modelos muito grandes, já que sua 
desempenho deixa a desejar. Para escrever grandes arquivos e preservar os blank 
nodes, escreva no formato de N-Triplas:</p>
+
+<blockquote>
+  <pre><code>// now write the model in XML form to a file
+model.write(System.out, "N-TRIPLE");
+  </code></pre>
+</blockquote>
+
+<p>Isso produzirá uma saída similar à do tutorial 3, que está em conformidade 
com a especificação de N-Triplas.</p>
+
+<h2><a id="ch-Reading RDF">Leitura de RDF</a></h2>
+
+<p><a href="../../../src-examples/jena/examples/rdf/Tutorial05.java">Tutorial 
5</a> demonstra a leitura  num modelo de sentenças gravadas num RDF XML. Com 
este tutorial, nós teremos criado uma pequena base de dados de vcards na forma 
RDF/XML. O código a seguir fará leitura e escrita. <em>Note que para esta 
aplicação rodar, o arquivo de entrada precisa estar no diretório da 
aplicação.</em></p>
+
+<blockquote>
+  <pre><code>
+ // create an empty model
+ Model model = ModelFactory.createDefaultModel();
+
+ // use the FileManager to find the input file
+ InputStream in = FileManager.get().open( inputFileName );
+if (in == null) {
+    throw new IllegalArgumentException(
+                                 "File: " + inputFileName + " not found");
+}
+
+// read the RDF/XML file
+model.read(in, null);
+
+// write it to standard out
+model.write(System.out);
+      </code></pre>
+</blockquote>
+
+<p>O segundo argumento da chamada de método <code>read()</code> é a URI que 
será usada para resolver URIs relativas. Como não há referências URI relativas 
no arquivo de teste, ele pode ser vazio. Quando executado, <a 
href="../../../src-examples/jena/examples/rdf/Tutorial05.java"> tutorial 5</a> 
produzirá uma saída XML como esta:</p>
+
+<blockquote>
+  <pre><code>&lt;rdf:RDF
+  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+  xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
+ &gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A0&quot;&gt;
+    &lt;vcard:Family&gt;Smith&lt;/vcard:Family&gt;
+    &lt;vcard:Given&gt;John&lt;/vcard:Given&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about='http://somewhere/JohnSmith/'&gt;
+    &lt;vcard:FN&gt;John Smith&lt;/vcard:FN&gt;
+    &lt;vcard:N rdf:nodeID=&quot;A0&quot;/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about='http://somewhere/SarahJones/'&gt;
+    &lt;vcard:FN&gt;Sarah Jones&lt;/vcard:FN&gt;
+    &lt;vcard:N rdf:nodeID=&quot;A1&quot;/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about='http://somewhere/MattJones/'&gt;
+    &lt;vcard:FN&gt;Matt Jones&lt;/vcard:FN&gt;
+    &lt;vcard:N rdf:nodeID=&quot;A2&quot;/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A3&quot;&gt;
+    &lt;vcard:Family&gt;Smith&lt;/vcard:Family&gt;
+    &lt;vcard:Given&gt;Rebecca&lt;/vcard:Given&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A1&quot;&gt;
+    &lt;vcard:Family&gt;Jones&lt;/vcard:Family&gt;
+    &lt;vcard:Given&gt;Sarah&lt;/vcard:Given&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A2&quot;&gt;
+    &lt;vcard:Family&gt;Jones&lt;/vcard:Family&gt;
+    &lt;vcard:Given&gt;Matthew&lt;/vcard:Given&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about='http://somewhere/RebeccaSmith/'&gt;
+    &lt;vcard:FN&gt;Becky Smith&lt;/vcard:FN&gt;
+    &lt;vcard:N rdf:nodeID=&quot;A3&quot;/&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;</code></pre>
+</blockquote>
+
+<h2 id="ch-Prefixes">Controlando prefixos</h2>
+
+<h3>Definições explícitas de prefixos</h3>
+
+Na sessão anterior, nós vimos que a saída XML declarou um prefixo namespace  
+<code>vcard</code> e o usou para abreviar URIs. Enquanto que RDF usa somente 
URIs completas, e não sua forma encurtada, Jena provê formas de controlar 
namespaces usados na saída com seu mapeamento de prefixos. Aqui vai um exemplo 
simples.
+
+<blockquote>
+<pre>
+<code>
+ Model m = ModelFactory.createDefaultModel();
+ String nsA = "http://somewhere/else#";;
+ String nsB = "http://nowhere/else#";;
+ Resource root = m.createResource( nsA + "root" );
+ Property P = m.createProperty( nsA + "P" );
+ Property Q = m.createProperty( nsB + "Q" );
+ Resource x = m.createResource( nsA + "x" );
+ Resource y = m.createResource( nsA + "y" );
+ Resource z = m.createResource( nsA + "z" );
+ m.add( root, P, x ).add( root, P, y ).add( y, Q, z );
+ System.out.println( "# -- no special prefixes defined" );
+ m.write( System.out );
+ System.out.println( "# -- nsA defined" );
+ m.setNsPrefix( "nsA", nsA );
+ m.write( System.out );
+ System.out.println( "# -- nsA and cat defined" );
+ m.setNsPrefix( "cat", nsB );
+ m.write( System.out );
+</code>
+</pre>
+</blockquote>
+
+A saída deste fragmento são três blocos de RDF/XML, com três diferentes 
mapeamentos de prefixos. Primeiro o padrão, sem prefixos diferentes dos padrões:
+
+<blockquote>
+<pre>
+<code>
+# -- no special prefixes defined
+
+&lt;rdf:RDF
+    xmlns:j.0="http://nowhere/else#";
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    xmlns:j.1="http://somewhere/else#"; &gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#root"&gt;
+    &lt;j.1:P rdf:resource="http://somewhere/else#x"/&gt;
+    &lt;j.1:P rdf:resource="http://somewhere/else#y"/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#y"&gt;
+    &lt;j.0:Q rdf:resource="http://somewhere/else#z"/&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;
+</code>
+</pre>
+</blockquote>
+
+Nós vimos que o namespace rdf é declarado automaticamente, já que são 
requeridos para tags como <code>&lt;RDF:rdf&gt;</code> e 
<code>&lt;rdf:resource&gt;</code>. Declarações de namespace são também 
necessárias para o uso das duas propriedades P e Q, mas já que seus namespaces 
não foram introduzidos no modelo, eles recebem nomes namespaces inventados 
<code>j.0</code> e <code>j.1</code>.
+
+<p>O método <code>setNsPrefix(String prefix, String URI)</code>
+declara que o namespace da <code>URI</code> deve ser abreviado por 
<code>prefixos</code>. Jena requer que o <code>prefixo</code> seja um namespace 
XML correto, e que o <code>URI</code> termine com um caractere sem-nome. O 
escritor RDF/XML transformará essas declarações de prefixos em declarações de 
namespaces XML e as usará nas suas saídas:
+
+
+<blockquote>
+<pre>
+<code>
+# -- nsA defined
+
+&lt;rdf:RDF
+    xmlns:j.0="http://nowhere/else#";
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    xmlns:nsA="http://somewhere/else#"; &gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#root"&gt;
+    &lt;nsA:P rdf:resource="http://somewhere/else#x"/&gt;
+    &lt;nsA:P rdf:resource="http://somewhere/else#y"/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#y"&gt;
+    &lt;j.0:Q rdf:resource="http://somewhere/else#z"/&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;
+</code>
+</pre>
+</blockquote>
+
+O outro namespace ainda recebe o nome criado automaticamente, mas o nome nsA é 
agora usado nas tags de propriedades. Não há necessidade de que o nome do 
prefixo tenha alguma relação com as variáveis do código Jena:
+
+<blockquote>
+<pre>
+<code>
+# -- nsA and cat defined
+
+&lt;rdf:RDF
+    xmlns:cat="http://nowhere/else#";
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    xmlns:nsA="http://somewhere/else#"; &gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#root"&gt;
+    &lt;nsA:P rdf:resource="http://somewhere/else#x"/&gt;
+    &lt;nsA:P rdf:resource="http://somewhere/else#y"/&gt;
+  &lt;/rdf:Description&gt;
+  &lt;rdf:Description rdf:about="http://somewhere/else#y"&gt;
+    &lt;cat:Q rdf:resource="http://somewhere/else#z"/&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;
+</code>
+</pre>
+</blockquote>
+
+Ambos os prefixos são usados na saída, e não houve a necessidade de prefixos 
gerados automaticamente.
+
+<h3>Definições implícitas de prefixos</h3>
+
+Assim como as declarações de prefixos definidas por chamadas a 
<code>setNsPrefix</code>, Jena vai lembrar-se dos prefixos que foram usados na 
entrada para <code>model.read()</code>.
+
+<p>Pegue a saída produzida pelo fragmento anterior e cole-o dentro de algum 
arquivo, com a URL  <b>file:/tmp/fragment.rdf</b> say. E execute o código:
+
+<blockquote>
+<pre>
+<code>
+Model m2 = ModelFactory.createDefaultModel();
+m2.read( "file:/tmp/fragment.rdf" );
+m2.write( System.out );
+</code>
+</pre>
+</blockquote>
+
+Você verá que os prefixos da entrada são preservados na saída. Todos os 
prefixos são escritos, mesmo se eles não forem usados em lugar algum. Você pode 
remover um prefixo com <code>removeNsPrefix(String prefix)</code> se você não o 
quiser na saída.
+
+<p>Como N-Triplas não possuem nenhuma forma reduzida de escrever URIs, não há 
prefixos nem na entrada nem na saída. A notação <b>N3</b>, também suportada 
pelo Jena, possui nomes prefixados reduzidos, e grava-os na entrada e usa-os na 
saída.
+
+<p>Jena possui outras operações sobre mapeamento de prefixos de um modelo, 
como um<code>Map</code> de Java extraído a partir dos mapeamentos existentes, 
ou a adição de um grupo inteiro de mapeamentos de uma só vez; olhe a 
documentação de <code>PrefixMapping</code> para mais detalhes.
+
+
+<h2 id="ch-Jena RDF Packages">Pacotes Jena RDF</h2>
+
+<p>Jena é uma API JAVA para aplicações de web semântica. O pacote RDF chave 
para o desenvolvedor é
+<code>com.hp.hpl.jena.rdf.model</code>. A API  tem sido definida em termos de 
interfaces, logo o código da aplicação pode trabalhar com diferentes 
implementações sem causar mudanças. Esse pacote contém interfaces para 
representar modelos, recursos, propriedades, literais, sentenças e todos os 
outros conceitos chaves de RDF, e um ModelFactory para criação de modelos. 
Portanto, o código da aplicação permanece independente da implementação, o 
melhor é usar interfaces onde for possível e não implementações específicas de 
classes.</p>
+
+<p>O pacote <code>com.hp.hpl.jena.tutorial</code> contém o código fonte 
funcional de todos os exemplos usados neste tutorial.</p>
+
+<p>Os pacotes <code>com.hp.hpl.jena...impl</code> contêm a implementação de 
classes que podem ser comuns a várias implementações. Por exemplo, eles definem 
as classes <code>ResourceImpl</code>,
+<code>PropertyImpl</code>, e <code>LiteralImpl</code> que podem ser usadas 
diretamente ou então herdadas por diferentes implementações. As aplicações 
devem raramente usar essas classes diretamente. Por exemplo, em vez de criar um 
nova instância de  <code>ResourceImpl</code>, é melhor usar o método 
<code>createResource</code> do modelo que estiver sendo usado. Desta forma, se 
a implementação do modelo usar uma implementação otimizada de 
<code>Resource</code>, então não serão necessárias conversões entre os dois 
tipos.</p>
+
+
+<h2 id="ch-Navigating a Model">Navegação em Modelos</h2>
+
+<p>Até agora, este tutorial mostrou como criar, ler e escrever modelos RDF. 
Chegou o momento de mostrar como acessar as informações mantidas num modelo.</p>
+
+<p> Dada a URI de um recurso, o objeto do recurso pode ser recuperado de um 
modelo usando o método <code>Model.getResource(String uri)</code>. Este método 
é definido para retornar um objeto Resource se ele existir no modelo, ou, caso 
contrário, criar um novo. Por exemplo, para recuperar o recurso Adam Smith do 
modelo lido a partir do arquivo no tutorial 5:</p>
+
+<blockquote>
+  <pre><code>// retrieve the John Smith vcard resource from the model
+Resource vcard = model.getResource(johnSmithURI);</code>
+  </pre>
+</blockquote>
+
+<p>A interface Resource define numerosos métodos para acessar as propriedades 
de um recurso. O método <code>Resource.getProperty(Property p)</code> acessa 
uma propriedade do recurso. Este método não segue a convenção usual de Java de 
acesso já que o tipo do objeto retorna é  <code>Statement,</code> e não 
<code>Property</code> como era de se esperar. Retornando toda a sentença 
permite à aplicação acessar o valor da propriedade usando um de seus métodos de 
acesso que retornam o objeto da sentença. Por exemplo, para recuperar o recurso 
que é o valor da propriedade <code>vcard:N</code></p>
+
+<blockquote>
+  <pre><code>// retrieve the value of the N property
+Resource name = (Resource) vcard.getProperty(VCARD.N)
+                                .getObject();</code></pre>
+</blockquote>
+
+<p>De modo geral, o objeto de uma sentença pode ser um recurso ou uma literal, 
então a aplicação, sabendo que o valor precisar ser um recurso, faz o cast do 
objeto retornado. Uma das coisas que Jena tenta fazer é fornecer tipos 
específicos de métodos, então a aplicação não tem que fazer cast, e checagem de 
tipos pode ser feita em tempo de compilação. O fragmento de código acima 
poderia ser mais convenientemente escrito assim:</p>
+
+<blockquote>
+  <pre><code>// retrieve the value of the FN property
+Resource name = vcard.getProperty(VCARD.N)
+                     .getResource();</code></pre>
+</blockquote>
+
+<p>Similarmente, o valor literal de uma propriedade pode ser recuperado:</p>
+
+<blockquote>
+  <pre><code>// retrieve the given name property
+String fullName = vcard.getProperty(VCARD.FN)
+                        .getString();</code></pre>
+</blockquote>
+
+<p>Neste exemplo, o recurso vcard possui somente as propriedades 
<code>vcard:FN</code> e <code>vcard:N</code>. RDF permite a um recurso repetir 
uma propriedade; por exemplo, Adam pode ter mais de um apelido. Vamos dar dois 
apelidos a ele:</p>
+
+<blockquote>
+  <pre><code>// add two nickname properties to vcard
+vcard.addProperty(VCARD.NICKNAME, "Smithy")
+     .addProperty(VCARD.NICKNAME, "Adman");</code></pre>
+</blockquote>
+
+<p>Como notado anteriormente, Jena representa um modelo RDF como um conjunto 
de sentenças, então, adicionar uma sentença com um sujeito, predicado e objeto 
igual a um já existente não terá efeito. Jena não define qual do dois apelidos 
será retornado. O resultado da chamada a 
<code>vcard.getProperty(VCARD.NICKNAME)</code> é indeterminado. Jena vai 
retornar um dos valores, mas não há garantia nem mesmo de que duas chamadas 
consecutivas irá retornar o mesmo valor.</p>
+
+<p>Se for possível que uma propriedade ocorra mais de uma vez, então o método  
Resource.listProperties(Property p) pode ser usado para retornar um iterador 
para lista-las. Este método retorna um iterador que retorna objetos do tipo 
<code>Statement</code>. Nós podemos listar os apelidos assim:</p>
+
+<blockquote>
+  <pre><code>// set up the output
+System.out.println("The nicknames of \""
+                      + fullName + "\" are:");
+// list the nicknames
+StmtIterator iter = vcard.listProperties(VCARD.NICKNAME);
+while (iter.hasNext()) {
+    System.out.println("    " + iter.nextStatement()
+                                    .getObject()
+                                    .toString());
+}</code></pre>
+</blockquote>
+
+<p>Esse código pode ser encontrado em  <a 
href="../../../src-examples/jena/examples/rdf/Tutorial06.java"> tutorial 6</a>. 
O iterador <code>iter</code> reproduz todas as sentenças com sujeito 
<code>vcard</code> e predicado <code>VCARD.NICKNAME</code>, então, iterar sobre 
ele permite recuperar cada sentença usando
+<code>nextStatement()</code>, pegar o campo do objeto, e convertê-lo para 
string. O código produz a seguinte saída quando executado:</p>
+
+<blockquote>
+  <pre><code>The nicknames of "John Smith" are:
+    Smithy
+    Adman</code></pre>
+</blockquote>
+
+<p>Todas as propriedades de um recurso podem ser listadas usando o método 
+<code>listProperties()</code> sem argumentos.
+</p>
+
+
+<h2 id="ch-Querying a Model">Consultas em Modelos</h2>
+
+<p>A sessão anterior mostrou como navegar um modelo a partir de um recurso com 
uma URI conhecida. Essa sessão mostrará como fazer buscas em um modelo. O 
núcleo da API Jena suporta um limitada primitiva de consulta. As consultas mais 
poderosas de RDQL são descritas em outros lugares.</p>
+
+<p>O método  <code>Model.listStatements()</code>, que lista todos as sentenças 
de um modelo, é talvez a forma mais crua de se consultar um modelo. Este uso 
não é recomendado em modelos muito grandes.
+<code>Model.listSubjects()</code> é similar, mas retorna um iterador sobre 
todos os recursos que possuem propriedades, <i>ie</i> são sujeitos de alguma 
sentença.</p>
+
+<p><code>Model.listSubjectsWithProperty(Property p, RDFNode
+o)</code><code></code> retornará um iterador sobre todos os  recursos com 
propriedade <code>p</code> de valor <code>o</code>. Se nós assumirmos que 
somente recursos vcard terão a propriedade <code>vcard:FN</code> e que, em 
nossos dados, todos esses recursos têm essa propriedade, então podemos 
encontrar todos os vCards assim:</p>
+
+<blockquote>
+  <pre><code>// list vcards
+ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);
+while (iter.hasNext()) {
+    Resource r = iter.nextResource();
+    ...
+}</code></pre>
+</blockquote>
+
+<p>Todos esses métodos de consulta são acuçar sintático sobre o método 
primitivo de consulta <code>model.listStatements(Selector s)</code>. Esse 
método retorna um iterador sobre todas as sentenças no modelo 'selecionado' por 
<code>s</code>. A interface de selector foi feita para ser extensível, mas por 
hora, só há uma implementação dela, a classe  <code>SimpleSelector</code> do 
pacote <code>com.hp.hpl.jena.rdf.model</code>. Usar <code>SimpleSelector 
</code> é uma das raras ocasiões em Jena onde é necessário usar uma classe 
especifica em vez de uma interface. O construtor de <code>SimpleSelector</code> 
recebe três argumentos:</p>
+
+<blockquote>
+  <pre><code>Selector selector = new SimpleSelector(subject, predicate, object)
+  </code></pre>
+</blockquote>
+
+<p>Esse selector vai selecionar todas as sentenças em que o sujeito casa com
+<code>subject</code>, um predicado que casa com <code>predicate</code> e um 
objeto que casa com <code>object</code>. Se <code>null</code> é passado para 
algum dos argumentos, ele vai casar com qualquer coisa, caso contrário, ele vai 
casar com os recursos ou literais correspondentes. (Dois recursos são iguais se 
eles possuem o mesmo URI ou são o mesmo blank node; dois literais são iguais se 
todos os seus componentes forem iguais.) Assim:</p>
+
+<blockquote>
+  <pre><code>Selector selector = new SimpleSelector(null, null, null);
+  </code></pre>
+</blockquote>
+
+<p>vai selecionar todas as sentenças do modelo.</p>
+
+<blockquote>
+  <pre><code>Selector selector = new SimpleSelector(null, VCARD.FN, null);
+  </code></pre>
+</blockquote>
+
+<p>vai selecionar todas as sentenças com o predicado VCARD.FN, independente do 
sujeito ou objeto. Como um atalho especial,
+
+<blockquote><code>listStatements( S, P, O )
+</code></blockquote>
+
+é equivalente a
+
+<blockquote><code>listStatements( new SimpleSelector( S, P, O ) )
+</code></blockquote>
+
+
+
+
+<p>
+O código a seguir, que pode ser encontrado em  <a
+href="../../../src-examples/jena/examples/rdf/Tutorial07.java">tutorial 7</a> 
que lista os nomes completos de todos os vcards do banco de dados.</p>
+
+<blockquote>
+  <pre><code>// select all the resources with a VCARD.FN property
+ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);
+if (iter.hasNext()) {
+    System.out.println("The database contains vcards for:");
+    while (iter.hasNext()) {
+        System.out.println("  " + iter.nextStatement()
+                                      .getProperty(VCARD.FN)
+                                      .getString());
+    }
+} else {
+    System.out.println("No vcards were found in the database");
+}
+            </code></pre>
+</blockquote>
+
+<p>Isso deve produzir uma saída similar a:</p>
+
+<blockquote>
+  <pre><code>The database contains vcards for:
+  Sarah Jones
+  John Smith
+  Matt Jones
+  Becky Smith
+  </code></pre>
+</blockquote>
+
+<p>Seu próximo exercício é modificar o código para usar <code>SimpleSelector
+</code>em vez de <code>listSubjectsWithProperty</code>.</p>
+
+<p>Vamos ver como implementar um controle mais refinado sobre as sentenças 
selecionadas.
+<code>SimpleSelector</code> pode ser herdado ter seus selects modificado para 
mais filtragens:</p>
+
+<blockquote>
+  <pre><code>// select all the resources with a VCARD.FN property
+// whose value ends with "Smith"
+StmtIterator iter = model.listStatements(
+    new SimpleSelector(null, VCARD.FN, (RDFNode) null) {
+        public boolean selects(Statement s)
+            {return s.getString().endsWith("Smith");}
+    });</code></pre>
+</blockquote>
+
+<p>Esse código usa uma técnica elegante de Java para sobrescrever a definição 
de um método quando criamos uma instância da classe. Aqui, o método 
<code>selects(...)</code> garante que o nome completo termine com “Smith”. É 
importante notar que a filtragem baseada nos argumentos sujeito, predicado e 
objeto tem lugar antes que o método <code>selects(...)</code> seja chamado, 
então esse teste extra só será aplicado para casar sentenças.</p>
+
+<p>O código completo pode ser encontrado no <a 
href="../../../src-examples/jena/examples/rdf/Tutorial08.java">tutorial
+8</a> e produz uma saída igual a:</p>
+
+<blockquote>
+  <pre><code>The database contains vcards for:
+  John Smith
+  Becky Smith</code></pre>
+</blockquote>
+
+<p></p>
+
+<p>Você pode imaginar que:</p>
+
+<blockquote>
+  <pre><code>// do all filtering in the selects method
+StmtIterator iter = model.listStatements(
+  new
+      SimpleSelector(null, null, (RDFNode) null) {
+          public boolean selects(Statement s) {
+              return (subject == null   || s.getSubject().equals(subject))
+                  &amp;&amp; (predicate == null || 
s.getPredicate().equals(predicate))
+                  &amp;&amp; (object == null    || 
s.getObject().equals(object))
+          }
+     }
+ });</code></pre>
+</blockquote>
+
+<p>é equivalente a:</p>
+
+<blockquote>
+  <pre><code>StmtIterator iter =
+  model.listStatements(new SimpleSelector(subject, predicate, 
object)</code></pre>
+</blockquote>
+
+<p>Embora possam ser funcionalmente equivalentes, a primeira forma vai listar 
todas as sentenças do modelo e testar cada uma individualmente, a segunda forma 
permite índices mantidos pela implementação para melhor a perfomance. Tente 
isso em modelos grandes e veja você mesmo, mas prepare uma chícara de café 
antes.</p>
+
+<h2 id="ch-Operations on Models">Operações em Modelos</h2>
+
+<p>Jena provê três operações para manipular modelos. Elas são operações comuns 
de conjunto: unão, intersecção e diferença.</p>
+
+<p>A união de dois modelos é a união do conjunto de sentenças que representa 
cada modelo. Esta é uma das operações chaves que RDF suporta. Isso permite que 
fontes de dados discrepantes sejam juntadas. Considere o seguintes modelos:</p>
+
+<p style="text-align: center">
+<img alt="figure 4" src="figures/fig4.png" width="240" height="240">and
+<img alt="figure 5" src="figures/fig5.png" width="240" height="240"></p>
+
+<p>Quando eles são juntados, os dois nós http://...JohnSmith são unidos em um, 
e o arco <code>vcard:FN</code> duplicado é descartado para produzir:</p>
+
+<p style="text-align: center">
+<img alt="figure 6" src="figures/fig6.png" width="540" height="240"></p>
+
+<p>Vamos ver o código (o código completo está em  <a
+href="../../../src-examples/jena/examples/rdf/Tutorial09.java">tutorial 9</a>) 
e ver o que acontece.</p>
+
+<blockquote>
+  <pre><code>// read the RDF/XML files
+model1.read(new InputStreamReader(in1), "");
+model2.read(new InputStreamReader(in2), "");
+
+// merge the Models
+Model model = model1.union(model2);
+
+// print the Model as RDF/XML
+model.write(system.out, "RDF/XML-ABBREV");</code></pre>
+</blockquote>
+
+<p>A saída produzida pelo PrettyWriter se assemelha a:</p>
+
+<blockquote>
+  <pre>&lt;rdf:RDF
+    xmlns:rdf=&quot;<a 
href="http://www.w3.org/1999/02/22-rdf-syntax-ns#";>http://www.w3.org/1999/02/22-rdf-syntax-ns#</a>&quot;
+    xmlns:vcard=&quot;http://www.w3.org/2001/vcard-rdf/3.0#&quot;&gt;
+  &lt;rdf:Description rdf:about=&quot;http://somewhere/JohnSmith/&quot;&gt;
+    &lt;vcard:EMAIL&gt;
+      &lt;vcard:internet&gt;
+        &lt;rdf:value&gt;[email protected]&lt;/rdf:value&gt;
+      &lt;/vcard:internet&gt;
+    &lt;/vcard:EMAIL&gt;
+    &lt;vcard:N rdf:parseType=&quot;Resource&quot;&gt;
+      &lt;vcard:Given&gt;John&lt;/vcard:Given&gt;
+      &lt;vcard:Family&gt;Smith&lt;/vcard:Family&gt;
+    &lt;/vcard:N&gt;
+    &lt;vcard:FN&gt;John Smith&lt;/vcard:FN&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;</pre>
+  <pre><code> </code></pre>
+</blockquote>
+
+<p>Mesmo que você não seja familiarizado com  os detalhes da sintaxe RDF/XML, 
deve ser relativamente claro que os modelos foram unidos como esperado A 
interseção e a diferença de modelos podem ser computados de maneira semelhante, 
usando os métodos <code>.intersection(Model)</code> e
+<code>.difference(Model)</code>; veja a documentação de
+<a 
href="/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html#difference(com.hp.hpl.jena.rdf.model.Model)">difference</a>
+e
+<a href 
"/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html#intersection(com.hp.hpl.jena.rdf.model.Model)">intersection</a>
+para mais detalhes.
+</p>
+
+<h2 id="ch-Containers">Containers</h2>
+
+<p>RDF defina um tipo especial de recursos para representar coleções de 
coisas. Esses recursos são chamados de <i>containers</i>. Os membros de um 
container podem ser tanto literais quanto recursos. Há três tipos de 
containers:</p>
+<ul>
+  <li>um BAG é uma coleção desordenada</li>
+  <li>uma ALT é uma coleção desordenada para representar alternativas</li>
+  <li>uma SEQ é uma coleção ordenada</li>
+</ul>
+
+<p>Um container é representado por um recurso. Esse recurso terá uma 
propriedade rdf:type cujo valor deve ser rdf:Bag, rdf:Alt, rdf:Seq, ou uma 
subclasse deles, dependendo do tipo do container. O primeiro membro do 
container é o valor da propriedade rdf:_1 do container; o segundo membro é o 
valor da propriedade rdf:_2 e assim por diante. As propriedades rdf:_nnn são 
conhecidas como <i>propriedades ordinais</i>.</p>
+
+<p>Por exemplo,  o modelo para uma bag simples contendo os vcards dos Smith 
pode se assemelhar a:</p>
+
+<p align="center">
+<img border="0" src="figures/fig3.png" alt="figure 3" width="720" 
height="420"></p>
+
+<p align="left">Embora os membros do bag serem representados pelas 
propriedades rdf:_1, rdf:_2 etc. a ordem das propriedades é insignificante. Nós 
poderíamos trocar os valores das propriedades rdf_1 e rdf_2 o resultado do 
modelo representaria a mesma informação.</p>
+
+<p align="left">ALTs representam alternativas. Por exemplo, vamos supor um 
recurso representando um software. Ele poderia ter uma propriedade indicando 
onde ele foi obtido. O valor dessa propriedade pode ser uma coleção ALT 
contendo vários sites de onde ele poderia ser baixado. ALTs são desordenados a 
menos que a propriedade rdf:_1 tenha significado especial. Ela representa a 
escolha padrão.</p>
+
+<p align="left">Embora os containers sejam manipulados como recursos e 
propriedades, Jena têm interfaces e implementações de classes explicitas para 
manipulá-los. Não é uma boa ideia ter um objeto manipulando um container e ao 
mesmo tempo modificando o estado do container usando métodos de mais baixo 
nível.</p>
+
+<p align="left">Vamos modificar o tutorial 8 para criar essa bag:</p>
+
+<blockquote>
+  <pre><code>// create a bag
+Bag smiths = model.createBag();
+
+// select all the resources with a VCARD.FN property
+// whose value ends with "Smith"
+StmtIterator iter = model.listStatements(
+    new SimpleSelector(null, VCARD.FN, (RDFNode) null) {
+        public boolean selects(Statement s) {
+                return s.getString().endsWith("Smith");
+        }
+    });
+// add the Smith's to the bag
+while (iter.hasNext()) {
+    smiths.add(iter.nextStatement().getSubject());
+}</code></pre>
+</blockquote>
+
+<p>Se nós imprimirmos esse modelo, vamos obter algo do tipo:</p>
+
+<blockquote>
+  <pre><code>&lt;rdf:RDF
+  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+  xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
+ &gt;
+...
+  &lt;rdf:Description rdf:nodeID=&quot;A3&quot;&gt;
+    &lt;rdf:type 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'/&gt;
+    &lt;rdf:_1 rdf:resource='http://somewhere/JohnSmith/'/&gt;
+    &lt;rdf:_2 rdf:resource='http://somewhere/RebeccaSmith/'/&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;</code></pre>
+</blockquote>
+
+<p>que representa o recurso Bag.</p>
+
+<p>A interface do container fornece um iterador para listar o conteúdo do 
container:</p>
+
+<blockquote>
+  <pre><code>// print out the members of the bag
+NodeIterator iter2 = smiths.iterator();
+if (iter2.hasNext()) {
+    System.out.println("The bag contains:");
+    while (iter2.hasNext()) {
+        System.out.println("  " +
+            ((Resource) iter2.next())
+                            .getProperty(VCARD.FN)
+                            .getString());
+    }
+} else {
+    System.out.println("The bag is empty");
+}</code></pre>
+</blockquote>
+
+<p>que produz a seguinte saída:</p>
+
+<blockquote>
+  <pre><code>The bag contains:
+  John Smith
+  Becky Smith</code></pre>
+</blockquote>
+
+<p>O código executável pode ser encontrado em  <a 
href="../../../src-examples/jena/examples/rdf/Tutorial10.java">
+tutorial 10</a>, que coloca esses fragmentos de código juntos num exemplo 
completo.</p>
+
+<p>As classes de Jena oferecem métodos para manipular containers, incluindo 
adição de novos membros, inserção de novos membros no meio de um container e a 
remoção de membros existentes. As classes de container Jena atualmente garantem 
que a lista ordenada de propriedades usadas começam com rdf:_1 e é contíguo. O 
RDFCore WG relaxou essa regra, permitindo uma representação parcial dos 
containers. Isso, portanto, é uma área de Jena que pode ser mudada no 
futuro.</p>
+
+<h2 id="ch-More about Literals and Datatypes">Mais sobre Literais e 
Datatypes</h2>
+
+<p>Literais RDF não são apenas strings. Literais devem ter uma tag para 
indicar a linguagem da literal. O diálogo de uma literal em Inglês é 
considerado diferente de um diálogo de uma literal em Francês. Esse 
comportamento estranho é um artefato da sintaxe RDF/XML original.</p>
+
+<p>Há na realidade dois tipos de Literais. Em uma delas, o componente string é 
somente isso, uma string ordinária. Na outra, o componente string é esperado 
que fosse um bem balanceado fragmento de XML.  Quando um modelo RDF é escrito 
como RDF/XML, uma construção especial usando um atributo parseType='Literal' é 
usado para representar isso.</p>
+
+<p>Em Jena, esses atributos de uma literal podem ser setados quando a literal 
é construída, e.g. no <a 
href="../../../src-examples/jena/examples/rdf/Tutorial11.java">tutorial 
11</a>:</p>
+
+<blockquote>
+  <pre><code>// create the resource
+Resource r = model.createResource();
+
+// add the property
+r.addProperty(RDFS.label, model.createLiteral("chat", "en"))
+ .addProperty(RDFS.label, model.createLiteral("chat", "fr"))
+ .addProperty(RDFS.label, model.createLiteral("&lt;em&gt;chat&lt;/em&gt;", 
true));
+
+// write out the Model
+model.write(system.out);</code></pre>
+</blockquote>
+
+<p>produz</p>
+
+<blockquote>
+  <pre><code>&lt;rdf:RDF
+  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
+  xmlns:rdfs='http://www.w3.org/2000/01/rdf-schema#'
+ &gt;
+  &lt;rdf:Description rdf:nodeID=&quot;A0&quot;&gt;
+    &lt;rdfs:label xml:lang='en'&gt;chat&lt;/rdfs:label&gt;
+    &lt;rdfs:label xml:lang='fr'&gt;chat&lt;/rdfs:label&gt;
+    &lt;rdfs:label 
rdf:parseType='Literal'&gt;&lt;em&gt;chat&lt;/em&gt;&lt;/rdfs:label&gt;
+  &lt;/rdf:Description&gt;
+&lt;/rdf:RDF&gt;</code></pre>
+</blockquote>
+
+<p>Para que duas literais sejam consideradas iguais, elas devem ser ambas 
literais XML ou ambas literais simples. Em adição a isso, ambas não devem 
possuir tag de linguagem, ou se as tags de linguagem estiverem presentes, elas 
devem ser iguais. Para simples literais strings, elas devem ser iguais. 
Literais XML têm duas noções de igualdade. A noção simples é que as condições 
anteriores são verdade e as strings também são iguais. A outra noção é de que 
elas podem ser iguais se a canonização das strings forem iguais.</p>
+
+<p>As interfaces de Jena também suportam literais tipadas. A maneira antiga 
(mostrada abaixo) trata literais tipadas como atalhos para strings: valores 
tipados são convertidos por Java em strings, e essas strings são armazenadas no 
modelo. Por exemplo, tente (observando que para literais simples, nós podemos 
omitir a chamada code>model.createLiteral</code>(...)):</p>
+
+<blockquote>
+  <pre><code>// create the resource
+Resource r = model.createResource();
+
+// add the property
+r.addProperty(RDFS.label, "11")
+ .addProperty(RDFS.label, 11);
+
+// write out the Model
+model.write(system.out, "N-TRIPLE");</code></pre>
+</blockquote>
+
+<p>A saída produzida é:</p>
+
+<blockquote>
+  <pre><code>_:A... &lt;http://www.w3.org/2000/01/rdf-schema#label&gt; "11" 
.</code></pre>
+</blockquote>
+
+<p>Já que ambas as literais são apenas a string “’11”, então somente uma 
sentença é adicionada</p>
+
+<p>O RDFCore WG definiu mecanismos para suportar datatypes em RDF. Jena os 
suporta usando mecanismos de <i>literais tipadas</i>; isso não é discutido 
neste tutorial.</p>
+
+<h2 id="ch-Glossary">Glossário</h2>
+
+<dl>
+
+<dt>Blank Node -
+<dd>representam recursos, mas não indica a URI para este recurso. Blank nodes 
atuam como variáveis qualificadas existencialmente em lógica de primeira ordem.
+
+<dt>Dublin Core -
+<dd>é um padrão para metadados sobre recursos web. Mais informações podem ser 
encontradas no site <a href="http://purl.oclc.org/dc/";>Dublin Core
+web site</a>.
+
+<dt>Literal -
+<dd>é uma cadeia de caracteres que pode ser o valor de uma propriedade.
+
+<dt>Objeto - 
+<dd>é a parte da tripla que é o valor de uma sentença.
+
+<dt>Predicado - 
+<dd>é a propriedade da tripla.
+
+<dt>Propriedade - 
+<dd>é um atributo do recurso. Por exemplo, DC.Title é uma propriedade, como 
também RDF.type.
+
+<dt>Recurso -
+<dd>é alguma entidade. Ele pode ser um recurso web como uma página, ou pode 
ser uma coisa concreta como um carro ou árvore. Pode ser uma ideia abstrata 
como xadrez ou futebol. Recursos são nomeados por URIs.
+
+<dt>Sentença -
+<dd>é um arco no modelo RDF, normalmente interpretado como um fato.
+
+<dt>Sujeito -
+<dd>é o recurso que é a fonte do arco num modelo RDF.
+
+<dt>Tripla -
+<dd>é a estrutura contendo o sujeito, o predicato e o objeto. Outro termo para 
sentença.
+
+</dl>

Property changes on: trunk/content/tutorials/rdf_api_pt.mdtext
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property

Reply via email to