Tutorial SPARQL – Filtros

Casamento em Grafos permite que sejam encontrados padrões no grafo. Essa seção descreve como os valores numa solução podem ser restritas. Há muitas comparações disponíveis – vamos apenas cobrir dois casos destes.

Casamento de Strings

SPARQL fornece uma operação para testar strings, baseada em expressões regulares. Isso inclui a habilidade de testes como SQL “LIKE”, no entanto, a sintaxe de expressões regulares é diferente de SQL.

A sintaxe é:

FILTER regex(?x, "pattern" [, "flags"])

O argumento flags é opcional. A flag “i” significa casamento de padrão case-insensitivo.

A consulta (q-f1.rq) procura nomes com um “r” ou “R” neles.

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?g
WHERE
{ ?y vcard:Given ?g .
  FILTER regex(?g, "r", "i") }

resultados:

-------------
| g         |
=============
| "Rebecca" |
| "Sarah"   |
-------------

A linguagem de expressão regular XQuery regular expression language é a versão codificada da mesma encontrada em Perl.

Testando valores

Muitas vezes, a aplicação necessita filtrar com o valor de uma variável. No arquivo vc-db-2.rdf, nós adicionamos um campo extra para idade. Idade não é definida no esquema de vcard então tivemos que criar uma nova propriedade para usar neste tutorial. RDF permite a mistura de diferentes definições de informação porque URIs são únicas. Note também que a propriedade info:age é tipada.

Nesse pedaço de dado, nós mostramos o valor tipado.

<http://somewhere/RebeccaSmith/>
    info:age "23"^^xsd:integer ;
    vCard:FN "Becky Smith" ;
    vCard:N [ vCard:Family "Smith" ;
              vCard:Given  "Rebecca" ] .

Então a consulta (q-f2.rq) para procurar as pessoas mais velhas que 24 anos é:

PREFIX info: <http://somewhere/peopleInfo#>

SELECT ?resource
WHERE
  {
    ?resource info:age ?age .
    FILTER (?age >= 24)
  }

A expressão aritmética precisa estar em parêntesis. A única solução é:

---------------------------------
| resource                      |
=================================
| <http://somewhere/JohnSmith/> |
---------------------------------

Apenas um resultado, resultando na URI para o recurso Jonh Smith. Se consultássemos os mais novos que 24 anos, resultaria em Rebecca Smith. Nada sobre os Jones.

O banco de dados não contém informação sobre a idade dos Jones: não há propriedades info:age nos seus vcards, então a variável age não recebe um valor, então não é testada.

Próximo: Opcionais