Przegląd (możliwości i ograniczenia), ogólna ocena i przykłady użycia różnych implementacji silników SPARQL.
Przykład zapytanie typu FEDERATED (użycie SERVICE
):
PREFIX : <http://example/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?a FROM <mybooks.rdf> { ?b dc:title ?title . SERVICE <http://sparql.org/books> { ?s dc:title ?title . ?s dc:creator ?a } }
Przykład implementacji własnej funkcji filtrującej:
public class max extends FunctionBase2 { public max() { super() ; } public NodeValue exec(NodeValue nv1, NodeValue nv2) { return Functions.max(nv1, nv2) ; } }
Wykorzystanie własnych funkcji filtrujących w zapytaniu:
PREFIX f: <java:app.myFunctions.> ... FILTER f:myTest(?x, ?y) ... FILTER (?x + f:myIntToXSD(?y)) ...
SPARQL XML query results format
,Przykład parsowania zapytania:
(parse-sparql "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?x ?name WHERE { ?x foaf:name ?name . ?x foaf:knows ?y . }") (SPARQL :SELECT :VARS (|x| |name|) :WHERE '(GRAPH-PATTERN (TRIPLE |x| !"foaf:name" |name|) (TRIPLE |x| !"foaf:knows" |y|)))
Przykład wykonania zapytania:
(sparql :select :distinct t :vars '(name mbox) :from "http://www.holygoat.co.uk/foaf.rdf" :where '(graph-pattern (triple x !foaf:knows !rich:RichardNewman) (triple x !foaf:name name) (triple x !foaf:mbox_sha1sum mbox))) <?xml version="1.0"?> <sparql xmlns="http://www.w3.org/2001/sw/DataAccess/rf1/result2"> <head> <variable name="NAME" /> <variable name="MBOX" /> </head> <results> <result> <binding name="NAME"><literal>Stephen Charles Cook</literal></binding> <binding name="MBOX"><literal>8a8d159b39d8789fa93c9d000b75f395a723343d</literal></binding> </result> <result> <binding name="NAME"><literal>Timothy Archer Millea</literal></binding> <binding name="MBOX"><literal>e9e511fb6acd12db93f899c9e28249b782c73f8a</literal></binding> ...
Przykład wykorzystania operacji INSERT
:
SQL>SPARQL INSERT INTO GRAPH <http://mygraph.com> { <:a> <:p> "123 abc" }; callret-0 VARCHAR _______________________________________________________________________________ Insert into <http://mygraph.com>, 1 triples -- done 1 Rows. -- 30 msec. SQL>SPARQL INSERT INTO GRAPH <http://mygraph.com> { <:a> <:p> "234 abc" }; callret-0 VARCHAR _______________________________________________________________________________ Insert into <http://mygraph.com>, 1 triples -- done 1 Rows. -- 0 msec.
SELECT
z użyciem funkcji atoi
:
SQL>SPARQL SELECT * FROM <http://mygraph.com> WHERE { ?s ?p ?o . filter (bif:atoi (?o) > 130) }; s p o VARCHAR VARCHAR VARCHAR ___________________________________ :a :p 234 abc 1 Rows. -- 10 msec.
Wykorzystanie funkcji contains
:
SQL>SPARQL SELECT * FROM <http://MyTest.com> WHERE { ?s ?p ?o . ?o bif:contains "world" }; s p o VARCHAR VARCHAR VARCHAR _______________________________________________________________________________ sxml1 p_all1 <Hello>world</Hello> nonxml1 p_all3 Hello world sxml2 p_all2 <Hello2>world</Hello2> 3 Rows. -- 20 msec.
Przykład użycia:
# SPARQL SELECT Query my $query = RDF::Query->new( 'SELECT * WHERE ...' ); my $iterator = $query->execute( $model ); while (my $row = $iterator->next) { # $row is a HASHref containing variable name -> RDF Term bindings print $row->{ 'var' }->as_string; } # SPARQL CONSTRUCT/DESCRIBE Query my $query = RDF::Query->new( 'CONSTRUCT { ... } WHERE ...' ); my $iterator = $query->execute( $model ); while (my $st = $iterator->next) { # $st is a RDF::Trine::Statement object representing an RDF triple print $st->as_string; } # SPARQL ASK Query my $query = RDF::Query->new( 'ASK WHERE ...' ); my $iterator = $query->execute( $model ); my $bool = $iterator->get_boolean; if ($bool) { print "Yes!\n"; } # RDQL Query my $query = new RDF::Query ( $rdql, { lang => 'rdql' } ); my @rows = $query->execute( $model ); # in list context, returns all results
LOAD
, INSERT
, DELETE
,
Przykład wykorzystanie funkcji concat
z MySQL:
PREFIX mysql: <http://web-semantics.org/ns/mysql/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?person WHERE { ?person foaf:givenname ?n1 ; foaf:family_name ?n2 . FILTER (mysql:concat(?n1, " ", ?n2) = "Alec Tronnick") . }
Przykład z użyciem agregacji:
SELECT ?who COUNT(?contact) AS ?contacts WHERE { ?who foaf:knows ?contact . } GROUP BY ?who