diff options
Diffstat (limited to 'core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php')
-rw-r--r-- | core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php | 216 |
1 files changed, 192 insertions, 24 deletions
diff --git a/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php b/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php index 35eca3d..2cf9ad5 100644 --- a/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php +++ b/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php @@ -5,7 +5,7 @@ * * LICENSE * - * Copyright (c) 2009-2012 Nicholas J Humfrey. All rights reserved. + * Copyright (c) 2009-2013 Nicholas J Humfrey. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -31,22 +31,24 @@ * POSSIBILITY OF SUCH DAMAGE. * * @package EasyRdf - * @copyright Copyright (c) 2009-2012 Nicholas J Humfrey + * @copyright Copyright (c) 2009-2013 Nicholas J Humfrey * @license http://www.opensource.org/licenses/bsd-license.php - * @version $Id$ */ /** * Class for making SPARQL queries using the SPARQL 1.1 Protocol * * @package EasyRdf - * @copyright Copyright (c) 2009-2012 Nicholas J Humfrey + * @copyright Copyright (c) 2009-2013 Nicholas J Humfrey * @license http://www.opensource.org/licenses/bsd-license.php */ class EasyRdf_Sparql_Client { - /** The address of the SPARQL Endpoint */ - private $uri = null; + /** The query/read address of the SPARQL Endpoint */ + private $queryUri = null; + + /** The update/write address of the SPARQL Endpoint */ + private $updateUri = null; /** Configuration settings */ private $config = array(); @@ -54,20 +56,47 @@ class EasyRdf_Sparql_Client /** Create a new SPARQL endpoint client * - * @param string $uri The address of the SPARQL Endpoint + * If the query and update endpoints are the same, then you + * only need to give a single URI. + * + * @param string $queryUri The address of the SPARQL Query Endpoint + * @param string $updateUri Optional address of the SPARQL Update Endpoint + */ + public function __construct($queryUri, $updateUri = null) + { + $this->queryUri = $queryUri; + if ($updateUri) { + $this->updateUri = $updateUri; + } else { + $this->updateUri = $queryUri; + } + } + + /** Get the URI of the SPARQL query endpoint + * + * @return string The query URI of the SPARQL endpoint */ - public function __construct($uri) + public function getQueryUri() { - $this->uri = $uri; + return $this->queryUri; } - /** Get the URI of the SPARQL endpoint + /** Get the URI of the SPARQL update endpoint * - * @return string The URI of the SPARQL endpoint + * @return string The query URI of the SPARQL endpoint + */ + public function getUpdateUri() + { + return $this->updateUri; + } + + /** + * @depredated + * @ignore */ public function getUri() { - return $this->uri; + return $this->queryUri; } /** Make a query to the SPARQL endpoint @@ -83,7 +112,119 @@ class EasyRdf_Sparql_Client */ public function query($query) { - # Add namespaces to the queryString + return $this->request('query', $query); + } + + /** Count the number of triples in a SPARQL 1.1 endpoint + * + * Performs a SELECT query to estriblish the total number of triples. + * + * Counts total number of triples by default but a conditional triple pattern + * can be given to count of a subset of all triples. + * + * @param string $condition Triple-pattern condition for the count query + * @return integer The number of triples + */ + public function countTriples($condition = '?s ?p ?o') + { + // SELECT (COUNT(*) AS ?count) + // WHERE { + // {?s ?p ?o} + // UNION + // {GRAPH ?g {?s ?p ?o}} + // } + $result = $this->query('SELECT (COUNT(*) AS ?count) {'.$condition.'}'); + return $result[0]->count->getValue(); + } + + /** Get a list of named graphs from a SPARQL 1.1 endpoint + * + * Performs a SELECT query to get a list of the named graphs + * + * @param string $limit Optional limit to the number of results + * @return array Array of EasyRdf_Resource objects for each named graph + */ + public function listNamedGraphs($limit = null) + { + $query = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s ?p ?o}}"; + if (!is_null($limit)) { + $query .= " LIMIT ".(int)$limit; + } + $result = $this->query($query); + + // Convert the result object into an array of resources + $graphs = array(); + foreach ($result as $row) { + array_push($graphs, $row->g); + } + return $graphs; + } + + /** Make an update request to the SPARQL endpoint + * + * Successful responses will return the HTTP response object + * + * Unsuccessful responses will throw an exception + * + * @param string $query The update query string to be executed + * @return object EasyRdf_Http_Response HTTP response + */ + public function update($query) + { + return $this->request('update', $query); + } + + public function insert($data, $graphUri = null) + { + #$this->updateData('INSET', + $query = 'INSERT DATA {'; + if ($graphUri) { + $query .= "GRAPH <$graphUri> {"; + } + $query .= $this->convertToTriples($data); + if ($graphUri) { + $query .= "}"; + } + $query .= '}'; + return $this->update($query); + } + + protected function updateData($operation, $data, $graphUri = null) + { + $query = "$operation DATA {"; + if ($graphUri) { + $query .= "GRAPH <$graphUri> {"; + } + $query .= $this->convertToTriples($data); + if ($graphUri) { + $query .= "}"; + } + $query .= '}'; + return $this->update($query); + } + + public function clear($graphUri, $silent = false) + { + $query = "CLEAR"; + if ($silent) { + $query .= " SILENT"; + } + if (preg_match("/^all|named|default$/i", $graphUri)) { + $query .= " $graphUri"; + } else { + $query .= " GRAPH <$graphUri>"; + } + return $this->update($query); + } + + /* + * Internal function to make an HTTP request to SPARQL endpoint + * + * @ignore + */ + protected function request($type, $query) + { + // Check for undefined prefixes $prefixes = ''; foreach (EasyRdf_Namespace::namespaces() as $prefix => $uri) { if (strpos($query, "$prefix:") !== false and @@ -94,9 +235,8 @@ class EasyRdf_Sparql_Client $client = EasyRdf_Http::getDefaultHttpClient(); $client->resetParameters(); - $client->setUri($this->uri); - $client->setMethod('GET'); + // Tell the server which response formats we can parse $accept = EasyRdf_Format::getHttpAcceptHeader( array( 'application/sparql-results+json' => 1.0, @@ -104,17 +244,40 @@ class EasyRdf_Sparql_Client ) ); $client->setHeaders('Accept', $accept); - $client->setParameterGet('query', $prefixes . $query); + + if ($type == 'update') { + $client->setMethod('POST'); + $client->setUri($this->updateUri); + $client->setRawData($prefixes . $query); + $client->setHeaders('Content-Type', 'application/sparql-update'); + } elseif ($type == 'query') { + // Use GET if the query is less than 2kB + // 2046 = 2kB minus 1 for '?' and 1 for NULL-terminated string on server + $encodedQuery = 'query='.urlencode($prefixes . $query); + if (strlen($encodedQuery) + strlen($this->queryUri) <= 2046) { + $client->setMethod('GET'); + $client->setUri($this->queryUri.'?'.$encodedQuery); + } else { + // Fall back to POST instead (which is un-cacheable) + $client->setMethod('POST'); + $client->setUri($this->queryUri); + $client->setRawData($encodedQuery); + $client->setHeaders('Content-Type', 'application/x-www-form-urlencoded'); + } + } $response = $client->request(); - if ($response->isSuccessful()) { + if ($response->getStatus() == 204) { + // No content + return $response; + } elseif ($response->isSuccessful()) { list($type, $params) = EasyRdf_Utils::parseMimeType( $response->getHeader('Content-Type') ); if (strpos($type, 'application/sparql-results') === 0) { return new EasyRdf_Sparql_Result($response->getBody(), $type); } else { - return new EasyRdf_Graph($this->uri, $response->getBody(), $type); + return new EasyRdf_Graph($this->queryUri, $response->getBody(), $type); } } else { throw new EasyRdf_Exception( @@ -123,12 +286,17 @@ class EasyRdf_Sparql_Client } } - /** Magic method to return URI of the SPARQL endpoint when casted to string - * - * @return string The URI of the SPARQL endpoint - */ - public function __toString() + protected function convertToTriples($data) { - return $this->uri == null ? '' : $this->uri; + if (is_string($data)) { + return $data; + } elseif (is_object($data) and $data instanceof EasyRdf_Graph) { + # FIXME: insert Turtle when there is a way of seperateing out the prefixes + return $data->serialise('ntriples'); + } else { + throw new EasyRdf_Exception( + "Don't know how to convert to triples for SPARQL query: ".$response->getBody() + ); + } } } |