summaryrefslogtreecommitdiffstats
path: root/core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php')
-rw-r--r--core/vendor/easyrdf/easyrdf/lib/EasyRdf/Sparql/Client.php216
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()
+ );
+ }
}
}