# SPARQLStore The `SPARQLStore` is the name for the component that can establish a connection between a [RDF triple store][tdb] and Semantic MediaWiki (a more general introduction can be found [here](https://www.semantic-mediawiki.org/wiki/Help:Using SPARQL and RDF stores)). The `SPARQLStore` is composed of a base store (by default using the existing `SQLStore`), a `QueryEngine`, and a connector to the RDF back-end. Currently, the base store takes the position of accumulating information about properties, value annotations, and statistics. ## Overview ``` SPARQLStore |- SPARQLStoreFactory |- ConnectionManager | |- RepositoryConnectionProvider | |- RepositoryClient | |- RepositoryConnection | |- FourstoreRepositoryConnector | |- FusekiRepositoryConnector | |- GenericRepositoryConnector | |- VirtuosoRepositoryConnector |- TurtleTriplesBuilder |- RepositoryRedirectLookup |- ReplicationDataTruncator |- QueryEngine |- HttpResponseParser |- XmlResponseParser |- ConditionBuilder |- DescriptionInterpreter ``` ## Repository connector A repository connector is responsible for establishing a communication between Semantic MediaWiki and an external [TDB][tdb] with the main objective to transfer/update triples from SMW to the back-end and to return result matches for a query request. The following client repositories have been tested: - [Jena Fuseki][fuseki] - [Virtuoso][virtuoso] - [Blazegraph][blazegraph] - [Sesame][sesame] - [4Store][4store] ### Create a connection
$connectionManager = new ConnectionManager(); $connectionManager->registerConnectionProvider( 'sparql', new RepositoryConnectionProvider( 'fuseki' ) ); $connection = $connectionManager->getConnection( 'sparql' )## QueryEngine The `QueryEngine` is responsible for transforming an `#ask` description object into a qualified [`SPARQL` query][sparql-query] expression. - The `ConditionBuilder` builds a SPARQL condition from an `#ask` query artefact (aka [`Description`][ask query] object) - The condition is transformed into a qualified `SPARQL` statement for which the [repository connector][connector] is making a http request to the back-end while awaiting an expected list of subjects that matched the condition in form of a `XML` or `JSON` response - The raw results are being parsed by a `HttpResponseParser` to provide a unified `RepositoryResult` object - During the final step, the `QueryResultFactory` converts the `RepositoryResult` into a SMW specific `QueryResult` object which will fetch the remaining data (those selected as printrequests) from the base store and make them available to a [`QueryResultPrinter`][resultprinter] ### Create a query request
/**
* Equivalent to [[Foo::+]]
*
* SELECT DISTINCT ?result WHERE {
* ?result swivt:wikiPageSortKey ?resultsk .
* ?result property:Foo ?v1 .
* }
* ORDER BY ASC(?resultsk)
*/
$description = new SomeProperty(
new DIProperty( 'Foo' ),
new ThingDescription()
);
$query = new Query( $description );
$sparqlStoreFactory = new SPARQLStoreFactory(
new SPARQLStore()
);
$queryEngine = $sparqlStoreFactory->newMasterQueryEngine();
$queryResult = $queryEngine->getQueryResult( $query );
[fuseki]: https://jena.apache.org/
[fuseki-dataset]: https://jena.apache.org/documentation/tdb/dynamic_datasets.html
[sparql-query]:http://www.w3.org/TR/sparql11-query/
[sparql-dataset]: https://www.w3.org/TR/sparql11-query/#specifyingDataset
[virtuoso]: https://github.com/openlink/virtuoso-opensource
[4store]: https://github.com/garlik/4store
[tdb]: http://en.wikipedia.org/wiki/Triplestore
[sesame]: http://rdf4j.org/
[blazegraph]: https://wiki.blazegraph.com/wiki/index.php/Main_Page
[ask query]: https://www.semantic-mediawiki.org/wiki/Query_language
[connector]: https://www.semantic-mediawiki.org/wiki/Help:SPARQLStore/RepositoryConnector
[resultprinter]: https://www.semantic-mediawiki.org/wiki/Help:SPARQLStore/RepositoryConnector