====== [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]]