====== [Narzędzia] Analiza dostępnych implementacji silnika SPARQL ======
===== Zespół =====
* Mariusz Okulanis, Osoba2
===== Opis =====
Przegląd (możliwości i ograniczenia), ogólna ocena i przykłady użycia różnych implementacji silników SPARQL.
===== Wymagania =====
===== Spotkania =====
===== Projekt =====
===== Sprawozdanie =====
==== Apache Jena - ARQ ====
* napisany w Javie,
* jest częścią Apache Jena (framework do budowy sieci semantycznych),
* umożliwia przeszukiwanie tekstu (przy użyciu Apache Lucene) - zarówno samych danych RDF jak i zewnętrznych dokumentów,
* w pełni implementuje protokół SPARQL,
* umożliwia wykorzystanie zewnętrznych endpointów,
* wspiera SPARQL Update,
* umożliwia pisanie własnych funkcji filtrujących,
* umożliwia wykonywanie zapytań typu FEDERATED,
* silnik nie skaluje się dobrze wraz ze wzrostem ilości triples,
* posiada dobrą dokumentacje.
Przykład zapytanie typu FEDERATED (użycie ''SERVICE''):
PREFIX :
PREFIX dc:
SELECT ?a
FROM
{
?b dc:title ?title .
SERVICE
{ ?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:
...
FILTER f:myTest(?x, ?y)
...
FILTER (?x + f:myIntToXSD(?y))
...
==== Allegro Graph - twinql ====
* Oprócz SPARQL AllegroGraph wspiera również zapytania RDFS++ i Prologu,
* twinql napisany jest w Common Lisp,
* oparty jest o [[http://wilbur-rdf.sourceforge.net/Wilbur Semantic Web Toolkit]],
* niepełne wsparcie standardu SPARQL (np. niepełna zgodność z gramatyką SPARQL),
* wsparcie dla SPARQL Update,
* zwraca rezultaty w formie human-readable listy lub ''SPARQL XML query results format'',
* wyposażony jest w optymalizator i kompilator zapytań,
* AllegroGraph i twinql zapewniają stosunkowo dobrą wydajność nawet dla dużych zestawów danych (25-50 milionów triples),
* dokumentacja twinql jest dosyć uboga.
Przykład parsowania zapytania:
(parse-sparql
"PREFIX foaf:
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)))
Stephen Charles Cook
8a8d159b39d8789fa93c9d000b75f395a723343d
Timothy Archer Millea
e9e511fb6acd12db93f899c9e28249b782c73f8a
...
==== Virtuoso ====
* kompletny framework do tworzenie sieci semantycznych,
* niepełne wsparcie standardu SPARQL (m.in. niepełna zgodność z gramatyką SPARQL, brak wsparcie dla Unicode),
* implementuje rozszerzenia standardu SPARQL (np. obsługa funkcji agregujących, obsługa wyrażeń wewnątrz triples oraz sekcji WHERE),
* wsparcie dla SPARQL Update, SPARQL Create, SPARQL Delete,
* możliwość geo-indeksowania,
* indeksowanie i wyszukiwanie tekstu,
* zapewnia REST-owy interfejs do wykonywania zapytań i innych operacji,
* możliwość skonfigurowania do użycia w klastrze,
* posiada rozbudowaną dokumentacje,
* bardzo dobrze się skaluje.
Przykład wykorzystania operacji ''INSERT'':
SQL>SPARQL INSERT INTO GRAPH { <:a>
<:p>
"123 abc" };
callret-0
VARCHAR
_______________________________________________________________________________
Insert into , 1 triples -- done
1 Rows. -- 30 msec.
SQL>SPARQL INSERT INTO GRAPH { <:a>
<:p>
"234 abc" };
callret-0
VARCHAR
_______________________________________________________________________________
Insert into , 1 triples -- done
1 Rows. -- 0 msec.
''SELECT'' z użyciem funkcji ''atoi'':
SQL>SPARQL
SELECT *
FROM
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
WHERE { ?s ?p ?o . ?o bif:contains "world" };
s p o
VARCHAR VARCHAR VARCHAR
_______________________________________________________________________________
sxml1 p_all1 world
nonxml1 p_all3 Hello world
sxml2 p_all2 world
3 Rows. -- 20 msec.
==== RDF::Query ====
* napisany w Perlu,
* w pełni zgodny ze standardem SPARQL,
* współpracuje z RDF::Trine, RDF::Redland i RDF::Core,
* obsługuje zapytania RDQL,
* posiada dosyć dobrą dokumentacje,
* nie jest aktywnie rozwijany (ostatnia aktualizacja w 2012 roku).
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
==== ARC2 ====
* napisany w PHP,
* niepełne wsparcie standardu SPARQL,
* implementuje własne rozszerzenia SPARQL (np. funkcje agregujące),
* jako backend wykorzystuje MySQL,
* pozwala na używanie funkcji MySQL wewnątrz zapytań,
* wspiera operacje ''LOAD'', ''INSERT'', ''DELETE'',
* posiada dosyć dobrą dokumentacje.
Przykład wykorzystanie funkcji ''concat'' z MySQL:
PREFIX mysql:
PREFIX foaf:
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
===== Materiały =====
* [[http://www.w3.org/wiki/SparqlImplementations|SPARQL implementations]]
* [[http://jena.apache.org/documentation/query/|ARQ]]
* [[http://jena.apache.org/index.html|Apache Jena]]
* [[http://franz.com/agraph/allegrograph/|AllegroGraph]]
* [[http://www.holygoat.co.uk/projects/twinql/|twinql]]
* [[http://wilbur-rdf.sourceforge.net/|Wilbur Semantic Web Toolkit]]
* [[http://virtuoso.openlinksw.com/rdf-quad-store/|Virtuoso]]
* [[http://docs.openlinksw.com/virtuoso/rdfsparql.html|Virtuoso SPARQL]]
* [[http://search.cpan.org/dist/RDF-Query/lib/RDF/Query.pm|RDF::Query]]
* [[https://github.com/semsol/arc2|ARC2]]
* [[http://www.w3.org/2001/sw/DataAccess/tests/implementations|Wsparcie standardu SPARQL]]
* [[http://www.it.uu.se/research/group/udbl/Theses/Shridevika.MaharajanMSc.pdf|Testy wydajnościowe silników]]