Mercurial > hg > rr-repo
diff sites/all/modules/sparql/sparql.module @ 4:ce11bbd8f642
added modules
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Thu, 19 Sep 2013 10:38:44 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/sparql/sparql.module Thu Sep 19 10:38:44 2013 +0100 @@ -0,0 +1,180 @@ +<?php +/* + * @file + * API function for running queries on external SPARQL endpoints. + */ + +define('SPARQL_ENDPOINT', 'endpoint'); + +/** + * Implements hook_help(). + */ +function sparql_help($path, $arg = NULL) { + switch ($path) { + case 'admin/settings/sparql': + return '<p>' . t('The sparql module provides an interface for other modules to perform sparql queries') . '</p>'; // TODO + } +} + +/** + * Executes a SPARQL query. + * + * @param $query + * The SPARQL query to execute. + * @param $endpoint + * An endpoint object, as returned by SPARQL Registry. + * @return + * The SPARQL results. + */ +function sparql_request($query, $endpoint) { + $rows = _sparql_request($query, $endpoint); + return $rows; +} + +function sparql_get_store($name, $type = 'store') { + $db = $GLOBALS['databases']['default']['default']; + $name = "sparql_store_$name"; + + $config = array( + /* db */ + 'db_host' => $db['host'], + 'db_name' => $db['database'], + 'db_user' => $db['username'], + 'db_pwd' => $db['password'], + /* store */ + 'store_name' => $name, + + /* endpoint */ + 'endpoint_features' => array( + 'select', 'construct', 'ask', 'describe', + 'load', 'insert', 'delete', + 'dump' /* dump is a special command for streaming SPOG export */ + ), + 'endpoint_timeout' => 60, /* not implemented in ARC2 preview */ + 'endpoint_read_key' => '', /* optional */ + 'endpoint_write_key' => 'somekey', /* optional */ + 'endpoint_max_limit' => 500, /* optional */ + ); + + /* instantiation */ + if ($type == SPARQL_ENDPOINT) { + $store = ARC2::getStoreEndpoint($config); + } + else { + $store = ARC2::getStore($config); + } + if (!$store->isSetUp()) { + $store->setUp(); + } + return $store; +} + +/** + * Runs a query against an endpoint. + * + * @param $query + * The SPARQL query to execute. + * @param $endpoint + * The endpoint to try the query against. + * @options + * Options to use with the remote or local store, as passed to + * sparql_request. + */ +function _sparql_request($query, $endpoint) { + // Initialize connection with the endpoint. + $store = _sparql_init_remote_store($endpoint); + + // Execute the query. + $rs = $store->query($query); + if ($errors = $store->getErrors()) { + // Log errors. + foreach ($errors as $error) { + trigger_error($error, E_USER_ERROR); + } + return NULL; + } + else { + // Success! + return $rs; + } +} + +/** + * Sets up an ARC2 RDF local repository. + * + * @param $name + * The name of the local repository. + * @param $endpoint + * Set to TRUE if this store should also be setup as a SPARQL endpoint. + * @return + * An ARC2 store object. + */ +function _sparql_init_store($name, $endpoint = FALSE) { + // @todo fix this. Error reporting is off because ARC2 throws strict warnings. + error_reporting(0); + + $db_spec = $GLOBALS['databases']['default']['default']; + + $config = array( + /* db */ + 'db_name' => $db_spec['database'], + 'db_user' => $db_spec['username'], + 'db_pwd' => isset($db_spec['password']) ? $db_spec['password'] : '', + /* store */ + 'store_name' => $name, + + /* endpoint */ + 'endpoint_features' => array( + 'select', 'construct', 'ask', 'describe', + //'load', 'insert', 'delete', + 'dump' /* dump is a special command for streaming SPOG export */ + ), + 'endpoint_timeout' => 60, /* not implemented in ARC2 preview */ + 'endpoint_read_key' => '', /* optional */ + 'endpoint_write_key' => '', /* optional */ + 'endpoint_max_limit' => 500, /* optional */ + ); + + // If this site is exposing a SPARQL endpoint, instantiate the endpoint with + // the endpoint class which can be used for HTTP-based data access. + if ($endpoint) { + $store = ARC2::getStoreEndpoint($config); + } + // Otherwise, instantiate a locally accessible store. + else { + $store = ARC2::getStore($config); + } + if (!$store->isSetUp()) { + $store->setUp(); + } + + return $store; +} + +/** + * Sets up an ARC2 RDF remote store. + * + * @param $endpoint + * The remote SPARQL endpoint. + * @return + * An ARC2 store object. + */ +function _sparql_init_remote_store($endpoint) { + $endpoint_url = $endpoint->uri; + + // If there are query parameters that need to be added before ARC2 processing, + // add them here. Filter the array to remove empty values. + if (isset($endpoint->options['query_parameters'])) { + $endpoint_url = url($endpoint_url, array('query' => array_filter($endpoint->options['query_parameters']))); + } + + $config = array( + /* remote endpoint */ + 'remote_store_endpoint' => $endpoint_url, + ); + + /* instantiation */ + $store = ARC2::getRemoteStore($config); + + return $store; +}