Файловый менеджер - Редактировать - /var/www/html/Sparql.zip
Ðазад
PK ! �5ѧs5 s5 Client.phpnu �[��� <?php namespace EasyRdf\Sparql; /** * EasyRdf * * LICENSE * * Copyright (c) 2009-2015 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: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or * promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package EasyRdf * @copyright Copyright (c) 2009-2015 Nicholas J Humfrey * @license https://www.opensource.org/licenses/bsd-license.php */ use EasyRdf\Exception; use EasyRdf\Format; use EasyRdf\Graph; use EasyRdf\Http; use EasyRdf\RdfNamespace; use EasyRdf\Utils; /** * Class for making SPARQL queries using the SPARQL 1.1 Protocol * * @package EasyRdf * @copyright Copyright (c) 2009-2015 Nicholas J Humfrey * @license https://www.opensource.org/licenses/bsd-license.php */ class Client { /** The query/read address of the SPARQL Endpoint */ private $queryUri = null; private $queryUri_has_params = false; /** The update/write address of the SPARQL Endpoint */ private $updateUri = null; /** Create a new SPARQL endpoint client * * 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 (strlen(parse_url($queryUri, PHP_URL_QUERY)) > 0) { $this->queryUri_has_params = true; } else { $this->queryUri_has_params = false; } 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 getQueryUri() { return $this->queryUri; } /** Get the URI of the SPARQL update endpoint * * @return string The query URI of the SPARQL endpoint */ public function getUpdateUri() { return $this->updateUri; } /** * @depredated * @ignore */ public function getUri() { return $this->queryUri; } /** Make a query to the SPARQL endpoint * * SELECT and ASK queries will return an object of type * EasyRdf\Sparql\Result. * * CONSTRUCT and DESCRIBE queries will return an object * of type EasyRdf\Graph. * * @param string $query The query string to be executed * * @return Result|\EasyRdf\Graph Result of the query. */ public function query($query) { 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 \EasyRdf\Resource[] array of 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 \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) { $processed_query = $this->preprocessQuery($query); $response = $this->executeQuery($processed_query, $type); if (!$response->isSuccessful()) { throw new Http\Exception("HTTP request for SPARQL query failed", 0, null, $response->getBody()); } if ($response->getStatus() == 204) { // No content return $response; } return $this->parseResponseToQuery($response); } protected function convertToTriples($data) { if (is_string($data)) { return $data; } elseif (is_object($data) and $data instanceof Graph) { # FIXME: insert Turtle when there is a way of seperateing out the prefixes return $data->serialise('ntriples'); } else { throw new Exception( "Don't know how to convert to triples for SPARQL query" ); } } /** * Adds missing prefix-definitions to the query * * Overriding classes may execute arbitrary query-alteration here * * @param string $query * @return string */ protected function preprocessQuery($query) { // Check for undefined prefixes $prefixes = ''; foreach (RdfNamespace::namespaces() as $prefix => $uri) { if (strpos($query, "{$prefix}:") !== false and strpos($query, "PREFIX {$prefix}:") === false ) { $prefixes .= "PREFIX {$prefix}: <{$uri}>\n"; } } return $prefixes . $query; } /** * Build http-client object, execute request and return a response * * @param string $processed_query * @param string $type Should be either "query" or "update" * * @return Http\Response|\Zend\Http\Response * @throws Exception */ protected function executeQuery($processed_query, $type) { $client = Http::getDefaultHttpClient(); $client->resetParameters(); // Tell the server which response formats we can parse $sparql_results_types = array( 'application/sparql-results+json' => 1.0, 'application/sparql-results+xml' => 0.8 ); if ($type == 'update') { // accept anything, as "response body of a […] update request is implementation defined" // @see http://www.w3.org/TR/sparql11-protocol/#update-success $accept = Format::getHttpAcceptHeader($sparql_results_types); $this->setHeaders($client, 'Accept', $accept); $client->setMethod('POST'); $client->setUri($this->updateUri); $client->setRawData($processed_query); $this->setHeaders($client, 'Content-Type', 'application/sparql-update'); } elseif ($type == 'query') { $re = '(?:(?:\s*BASE\s*<.*?>\s*)|(?:\s*PREFIX\s+.+:\s*<.*?>\s*))*'. '(CONSTRUCT|SELECT|ASK|DESCRIBE)[\W]'; $result = null; $matched = mb_eregi($re, $processed_query, $result); if (false === $matched or count($result) !== 2) { // non-standard query. is this something non-standard? $query_verb = null; } else { $query_verb = strtoupper($result[1]); } if ($query_verb === 'SELECT' or $query_verb === 'ASK') { // only "results" $accept = Format::formatAcceptHeader($sparql_results_types); } elseif ($query_verb === 'CONSTRUCT' or $query_verb === 'DESCRIBE') { // only "graph" $accept = Format::getHttpAcceptHeader(); } else { // both $accept = Format::getHttpAcceptHeader($sparql_results_types); } $this->setHeaders($client, 'Accept', $accept); $encodedQuery = 'query=' . urlencode($processed_query); // Use GET if the query is less than 2kB // 2046 = 2kB minus 1 for '?' and 1 for NULL-terminated string on server if (strlen($encodedQuery) + strlen($this->queryUri) <= 2046) { $delimiter = $this->queryUri_has_params ? '&' : '?'; $client->setMethod('GET'); $client->setUri($this->queryUri . $delimiter . $encodedQuery); } else { // Fall back to POST instead (which is un-cacheable) $client->setMethod('POST'); $client->setUri($this->queryUri); $client->setRawData($encodedQuery); $this->setHeaders($client, 'Content-Type', 'application/x-www-form-urlencoded'); } } else { throw new Exception('unexpected request-type: '.$type); } if ($client instanceof \Zend\Http\Client) { return $client->send(); } else { return $client->request(); } } /** * Parse HTTP-response object into a meaningful result-object. * * Can be overridden to do custom processing * * @param Http\Response|\Zend\Http\Response $response * @return Graph|Result */ protected function parseResponseToQuery($response) { list($content_type,) = Utils::parseMimeType($response->getHeader('Content-Type')); if (strpos($content_type, 'application/sparql-results') === 0) { $result = new Result($response->getBody(), $content_type); return $result; } else { $result = new Graph($this->queryUri, $response->getBody(), $content_type); return $result; } } /** * Proxy function to allow usage of our Client as well as Zend\Http v2. * * Zend\Http\Client only accepts an array as first parameter, but our Client wants a name-value pair. * * @see https://framework.zend.com/apidoc/2.4/classes/Zend.Http.Client.html#method_setHeaders * * @todo Its only a temporary fix, should be replaced or refined in the future. */ protected function setHeaders($client, $name, $value) { if ($client instanceof \Zend\Http\Client) { $client->setHeaders([$name => $value]); } else { $client->setHeaders($name, $value); } } } PK ! ��l�/: /: Result.phpnu �[��� <?php namespace EasyRdf\Sparql; /** * EasyRdf * * LICENSE * * Copyright (c) 2009-2020 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: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or * promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package EasyRdf * @copyright Copyright (c) 2009-2020 Nicholas J Humfrey * @license https://www.opensource.org/licenses/bsd-license.php */ use EasyRdf\Exception; use EasyRdf\Literal; use EasyRdf\Resource; /** * Class for returned for SPARQL SELECT and ASK query responses. * * @package EasyRdf * @copyright Copyright (c) 2009-2020 Nicholas J Humfrey * @license https://www.opensource.org/licenses/bsd-license.php */ class Result extends \ArrayIterator { /** The SPARQL Results type (either 'boolean' or 'bindings') */ private $type = null; /** The value of a boolean result */ private $boolean = null; /** Keep track of the XML parser state */ private $fields = array(); /** Keep track of the XML parser state */ private $parseState = array(); /** A constant for the SPARQL Query Results XML Format namespace */ const SPARQL_XML_RESULTS_NS = 'http://www.w3.org/2005/sparql-results#'; /** Create a new SPARQL Result object * * You should not normally need to create a SPARQL result * object directly - it will be constructed automatically * for you by EasyRdf\Sparql\_Client. * * @param string $data The SPARQL result body * @param string $mimeType The MIME type of the result * * @throws \EasyRdf\Exception */ public function __construct($data, $mimeType) { if ($mimeType == 'application/sparql-results+xml') { $this->parseXml($data); } elseif ($mimeType == 'application/sparql-results+json') { $this->parseJson($data); } else { throw new Exception( "Unsupported SPARQL Query Results format: $mimeType" ); } } /** Get the query result type (boolean/bindings) * * ASK queries return a result of type 'boolean'. * SELECT query return a result of type 'bindings'. * * @return string The query result type. */ public function getType() { return $this->type; } /** Return the boolean value of the query result * * If the query was of type boolean then this method will * return either true or false. If the query was of some other * type then this method will return null. * * @return boolean The result of the query. */ public function getBoolean() { return $this->boolean; } /** Return true if the result of the query was true. * * @return boolean True if the query result was true. */ public function isTrue() { return $this->boolean == true; } /** Return false if the result of the query was false. * * @return boolean True if the query result was false. */ public function isFalse() { return $this->boolean == false; } /** Return the number of fields in a query result of type bindings. * * @return integer The number of fields. */ public function numFields() { return count($this->fields); } /** Return the number of rows in a query result of type bindings. * * @return integer The number of rows. */ public function numRows() { return count($this); } /** Get the field names in a query result of type bindings. * * @return array The names of the fields in the result. */ public function getFields() { return $this->fields; } /** Return a human readable view of the query result. * * This method is intended to be a debugging aid and will * return a pretty-print view of the query result. * * @param string $format Either 'text' or 'html' * * @throws Exception * @return string */ public function dump($format = 'html') { if ($this->type == 'bindings') { $result = ''; if ($format == 'html') { $result .= "<table class='sparql-results' style='border-collapse:collapse'>"; $result .= "<tr>"; foreach ($this->fields as $field) { $result .= "<th style='border:solid 1px #000;padding:4px;". "vertical-align:top;background-color:#eee;'>". "?$field</th>"; } $result .= "</tr>"; foreach ($this as $row) { $result .= "<tr>"; foreach ($this->fields as $field) { if (isset($row->$field)) { $result .= "<td style='border:solid 1px #000;padding:4px;". "vertical-align:top'>". $row->$field->dumpValue($format)."</td>"; } else { $result .= "<td> </td>"; } } $result .= "</tr>"; } $result .= "</table>"; } else { // First calculate the width of each comment $colWidths = array(); foreach ($this->fields as $field) { $colWidths[$field] = strlen($field); } $textData = array(); foreach ($this as $row) { $textRow = array(); foreach ($row as $k => $v) { $textRow[$k] = $v->dumpValue('text'); $width = strlen($textRow[$k]); if ($colWidths[$k] < $width) { $colWidths[$k] = $width; } } $textData[] = $textRow; } // Create a horizontal rule $hr = "+"; foreach ($colWidths as $v) { $hr .= "-".str_repeat('-', $v).'-+'; } // Output the field names $result .= "$hr\n|"; foreach ($this->fields as $field) { $result .= ' '.str_pad("?$field", $colWidths[$field]).' |'; } // Output each of the rows $result .= "\n$hr\n"; foreach ($textData as $textRow) { $result .= '|'; foreach ($textRow as $k => $v) { $result .= ' '.str_pad($v, $colWidths[$k]).' |'; } $result .= "\n"; } $result .= "$hr\n"; } return $result; } elseif ($this->type == 'boolean') { $str = ($this->boolean ? 'true' : 'false'); if ($format == 'html') { return "<p>Result: <span style='font-weight:bold'>$str</span></p>"; } else { return "Result: $str"; } } else { throw new Exception( "Failed to dump SPARQL Query Results format, unknown type: ".$this->type ); } } /** Create a new EasyRdf\Resource or EasyRdf\Literal depending * on the type of data passed in. * * @ignore */ protected function newTerm($data) { switch ($data['type']) { case 'bnode': return new Resource('_:'.$data['value']); case 'uri': return new Resource($data['value']); case 'literal': case 'typed-literal': return Literal::create($data); default: throw new Exception( "Failed to parse SPARQL Query Results format, unknown term type: ". $data['type'] ); } } /** XML Result Parser: this function is called when an XML element starts * * @ignore */ public function startElementHandler($parser) { if ($parser->depth() == 1) { if ($parser->name != 'sparql') { throw new Exception( "Root node in XML Query Results format is not <sparql>" ); } elseif ($parser->namespaceURI != self::SPARQL_XML_RESULTS_NS) { throw new Exception( "Root node namespace is not ".self::SPARQL_XML_RESULTS_NS ); } } else { switch ($parser->path()) { case 'sparql/boolean': $this->type = 'boolean'; break; case 'sparql/head/variable': $this->fields[] = $parser->getAttribute('name'); break; case 'sparql/results': $this->type = 'bindings'; break; case 'sparql/results/result': $this->parseState['result'] = new \stdClass(); break; case 'sparql/results/result/binding': $this->parseState['key'] = $parser->getAttribute('name'); $this->parseState['bindingType'] = null; $this->parseState['text'] = null; $this->parseState['lang'] = null; $this->parseState['datatype'] = null; break; case 'sparql/results/result/binding/bnode': $this->parseState['bindingType'] = 'bnode'; break; case 'sparql/results/result/binding/literal': $this->parseState['bindingType'] = 'literal'; $this->parseState['lang'] = $parser->getAttribute('xml:lang'); $this->parseState['datatype'] = $parser->getAttribute('datatype'); break; case 'sparql/results/result/binding/uri': $this->parseState['bindingType'] = 'uri'; break; } } } /** XML Result Parser: this function is called when text is encountered * * @ignore */ public function textHandler($parser) { $this->parseState['text'] = $parser->value; } /** XML Result Parser: this function is called when an XML element ends * * @ignore */ public function endElementHandler($parser) { switch ($parser->path()) { case 'sparql/boolean': $this->boolean = ($this->parseState['text'] == 'true') ? true : false; break; case 'sparql/results/result/binding': $key = $this->parseState['key']; $this->parseState['result']->$key = $this->newTerm([ 'type' => $this->parseState['bindingType'], 'value' => $this->parseState['text'], 'lang' => $this->parseState['lang'], 'datatype' => $this->parseState['datatype'] ]); break; case 'sparql/results/result': $this[] = $this->parseState['result']; break; } } /** Parse a SPARQL result in the XML format into the object. * * @ignore */ protected function parseXml($data) { $this->parseState = array(); $this->type = null; $parser = new \EasyRdf\XMLParser(); $parser->startElementCallback = [$this, 'startElementHandler']; $parser->textCallback = [$this, 'textHandler']; $parser->endElementCallback = [$this, 'endElementHandler']; $parser->parse($data); if (!$this->type) { throw new Exception( "Failed to parse SPARQL XML Query Results format: unknown type" ); } } /** Parse a SPARQL result in the JSON format into the object. * * @ignore */ protected function parseJson($data) { // Decode JSON to an array $data = json_decode($data, true); if (isset($data['boolean'])) { $this->type = 'boolean'; $this->boolean = $data['boolean']; } elseif (isset($data['results'])) { $this->type = 'bindings'; if (isset($data['head']['vars'])) { $this->fields = $data['head']['vars']; } foreach ($data['results']['bindings'] as $row) { $t = new \stdClass(); foreach ($row as $key => $value) { $t->$key = $this->newTerm($value); } $this[] = $t; } } else { throw new Exception( "Failed to parse SPARQL JSON Query Results format" ); } } /** Magic method to return value of the result to string * * If this is a boolean result then it will return 'true' or 'false'. * If it is a bindings type, then it will dump as a text based table. * * @return string A string representation of the result. */ public function __toString() { if ($this->type == 'boolean') { return $this->boolean ? 'true' : 'false'; } else { return $this->dump('text'); } } } PK ! �5ѧs5 s5 Client.phpnu �[��� PK ! ��l�/: /: �5 Result.phpnu �[��� PK � p
| ver. 1.1 | |
.
| PHP 8.4.18 | Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтраницы: 0 |
proxy
|
phpinfo
|
ÐаÑтройка