danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2 /*
|
danielebarchiesi@4
|
3 * @file
|
danielebarchiesi@4
|
4 * API function for running queries on external SPARQL endpoints.
|
danielebarchiesi@4
|
5 */
|
danielebarchiesi@4
|
6
|
danielebarchiesi@4
|
7 define('SPARQL_ENDPOINT', 'endpoint');
|
danielebarchiesi@4
|
8
|
danielebarchiesi@4
|
9 /**
|
danielebarchiesi@4
|
10 * Implements hook_help().
|
danielebarchiesi@4
|
11 */
|
danielebarchiesi@4
|
12 function sparql_help($path, $arg = NULL) {
|
danielebarchiesi@4
|
13 switch ($path) {
|
danielebarchiesi@4
|
14 case 'admin/settings/sparql':
|
danielebarchiesi@4
|
15 return '<p>' . t('The sparql module provides an interface for other modules to perform sparql queries') . '</p>'; // TODO
|
danielebarchiesi@4
|
16 }
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18
|
danielebarchiesi@4
|
19 /**
|
danielebarchiesi@4
|
20 * Executes a SPARQL query.
|
danielebarchiesi@4
|
21 *
|
danielebarchiesi@4
|
22 * @param $query
|
danielebarchiesi@4
|
23 * The SPARQL query to execute.
|
danielebarchiesi@4
|
24 * @param $endpoint
|
danielebarchiesi@4
|
25 * An endpoint object, as returned by SPARQL Registry.
|
danielebarchiesi@4
|
26 * @return
|
danielebarchiesi@4
|
27 * The SPARQL results.
|
danielebarchiesi@4
|
28 */
|
danielebarchiesi@4
|
29 function sparql_request($query, $endpoint) {
|
danielebarchiesi@4
|
30 $rows = _sparql_request($query, $endpoint);
|
danielebarchiesi@4
|
31 return $rows;
|
danielebarchiesi@4
|
32 }
|
danielebarchiesi@4
|
33
|
danielebarchiesi@4
|
34 function sparql_get_store($name, $type = 'store') {
|
danielebarchiesi@4
|
35 $db = $GLOBALS['databases']['default']['default'];
|
danielebarchiesi@4
|
36 $name = "sparql_store_$name";
|
danielebarchiesi@4
|
37
|
danielebarchiesi@4
|
38 $config = array(
|
danielebarchiesi@4
|
39 /* db */
|
danielebarchiesi@4
|
40 'db_host' => $db['host'],
|
danielebarchiesi@4
|
41 'db_name' => $db['database'],
|
danielebarchiesi@4
|
42 'db_user' => $db['username'],
|
danielebarchiesi@4
|
43 'db_pwd' => $db['password'],
|
danielebarchiesi@4
|
44 /* store */
|
danielebarchiesi@4
|
45 'store_name' => $name,
|
danielebarchiesi@4
|
46
|
danielebarchiesi@4
|
47 /* endpoint */
|
danielebarchiesi@4
|
48 'endpoint_features' => array(
|
danielebarchiesi@4
|
49 'select', 'construct', 'ask', 'describe',
|
danielebarchiesi@4
|
50 'load', 'insert', 'delete',
|
danielebarchiesi@4
|
51 'dump' /* dump is a special command for streaming SPOG export */
|
danielebarchiesi@4
|
52 ),
|
danielebarchiesi@4
|
53 'endpoint_timeout' => 60, /* not implemented in ARC2 preview */
|
danielebarchiesi@4
|
54 'endpoint_read_key' => '', /* optional */
|
danielebarchiesi@4
|
55 'endpoint_write_key' => 'somekey', /* optional */
|
danielebarchiesi@4
|
56 'endpoint_max_limit' => 500, /* optional */
|
danielebarchiesi@4
|
57 );
|
danielebarchiesi@4
|
58
|
danielebarchiesi@4
|
59 /* instantiation */
|
danielebarchiesi@4
|
60 if ($type == SPARQL_ENDPOINT) {
|
danielebarchiesi@4
|
61 $store = ARC2::getStoreEndpoint($config);
|
danielebarchiesi@4
|
62 }
|
danielebarchiesi@4
|
63 else {
|
danielebarchiesi@4
|
64 $store = ARC2::getStore($config);
|
danielebarchiesi@4
|
65 }
|
danielebarchiesi@4
|
66 if (!$store->isSetUp()) {
|
danielebarchiesi@4
|
67 $store->setUp();
|
danielebarchiesi@4
|
68 }
|
danielebarchiesi@4
|
69 return $store;
|
danielebarchiesi@4
|
70 }
|
danielebarchiesi@4
|
71
|
danielebarchiesi@4
|
72 /**
|
danielebarchiesi@4
|
73 * Runs a query against an endpoint.
|
danielebarchiesi@4
|
74 *
|
danielebarchiesi@4
|
75 * @param $query
|
danielebarchiesi@4
|
76 * The SPARQL query to execute.
|
danielebarchiesi@4
|
77 * @param $endpoint
|
danielebarchiesi@4
|
78 * The endpoint to try the query against.
|
danielebarchiesi@4
|
79 * @options
|
danielebarchiesi@4
|
80 * Options to use with the remote or local store, as passed to
|
danielebarchiesi@4
|
81 * sparql_request.
|
danielebarchiesi@4
|
82 */
|
danielebarchiesi@4
|
83 function _sparql_request($query, $endpoint) {
|
danielebarchiesi@4
|
84 // Initialize connection with the endpoint.
|
danielebarchiesi@4
|
85 $store = _sparql_init_remote_store($endpoint);
|
danielebarchiesi@4
|
86
|
danielebarchiesi@4
|
87 // Execute the query.
|
danielebarchiesi@4
|
88 $rs = $store->query($query);
|
danielebarchiesi@4
|
89 if ($errors = $store->getErrors()) {
|
danielebarchiesi@4
|
90 // Log errors.
|
danielebarchiesi@4
|
91 foreach ($errors as $error) {
|
danielebarchiesi@4
|
92 trigger_error($error, E_USER_ERROR);
|
danielebarchiesi@4
|
93 }
|
danielebarchiesi@4
|
94 return NULL;
|
danielebarchiesi@4
|
95 }
|
danielebarchiesi@4
|
96 else {
|
danielebarchiesi@4
|
97 // Success!
|
danielebarchiesi@4
|
98 return $rs;
|
danielebarchiesi@4
|
99 }
|
danielebarchiesi@4
|
100 }
|
danielebarchiesi@4
|
101
|
danielebarchiesi@4
|
102 /**
|
danielebarchiesi@4
|
103 * Sets up an ARC2 RDF local repository.
|
danielebarchiesi@4
|
104 *
|
danielebarchiesi@4
|
105 * @param $name
|
danielebarchiesi@4
|
106 * The name of the local repository.
|
danielebarchiesi@4
|
107 * @param $endpoint
|
danielebarchiesi@4
|
108 * Set to TRUE if this store should also be setup as a SPARQL endpoint.
|
danielebarchiesi@4
|
109 * @return
|
danielebarchiesi@4
|
110 * An ARC2 store object.
|
danielebarchiesi@4
|
111 */
|
danielebarchiesi@4
|
112 function _sparql_init_store($name, $endpoint = FALSE) {
|
danielebarchiesi@4
|
113 // @todo fix this. Error reporting is off because ARC2 throws strict warnings.
|
danielebarchiesi@4
|
114 error_reporting(0);
|
danielebarchiesi@4
|
115
|
danielebarchiesi@4
|
116 $db_spec = $GLOBALS['databases']['default']['default'];
|
danielebarchiesi@4
|
117
|
danielebarchiesi@4
|
118 $config = array(
|
danielebarchiesi@4
|
119 /* db */
|
danielebarchiesi@4
|
120 'db_name' => $db_spec['database'],
|
danielebarchiesi@4
|
121 'db_user' => $db_spec['username'],
|
danielebarchiesi@4
|
122 'db_pwd' => isset($db_spec['password']) ? $db_spec['password'] : '',
|
danielebarchiesi@4
|
123 /* store */
|
danielebarchiesi@4
|
124 'store_name' => $name,
|
danielebarchiesi@4
|
125
|
danielebarchiesi@4
|
126 /* endpoint */
|
danielebarchiesi@4
|
127 'endpoint_features' => array(
|
danielebarchiesi@4
|
128 'select', 'construct', 'ask', 'describe',
|
danielebarchiesi@4
|
129 //'load', 'insert', 'delete',
|
danielebarchiesi@4
|
130 'dump' /* dump is a special command for streaming SPOG export */
|
danielebarchiesi@4
|
131 ),
|
danielebarchiesi@4
|
132 'endpoint_timeout' => 60, /* not implemented in ARC2 preview */
|
danielebarchiesi@4
|
133 'endpoint_read_key' => '', /* optional */
|
danielebarchiesi@4
|
134 'endpoint_write_key' => '', /* optional */
|
danielebarchiesi@4
|
135 'endpoint_max_limit' => 500, /* optional */
|
danielebarchiesi@4
|
136 );
|
danielebarchiesi@4
|
137
|
danielebarchiesi@4
|
138 // If this site is exposing a SPARQL endpoint, instantiate the endpoint with
|
danielebarchiesi@4
|
139 // the endpoint class which can be used for HTTP-based data access.
|
danielebarchiesi@4
|
140 if ($endpoint) {
|
danielebarchiesi@4
|
141 $store = ARC2::getStoreEndpoint($config);
|
danielebarchiesi@4
|
142 }
|
danielebarchiesi@4
|
143 // Otherwise, instantiate a locally accessible store.
|
danielebarchiesi@4
|
144 else {
|
danielebarchiesi@4
|
145 $store = ARC2::getStore($config);
|
danielebarchiesi@4
|
146 }
|
danielebarchiesi@4
|
147 if (!$store->isSetUp()) {
|
danielebarchiesi@4
|
148 $store->setUp();
|
danielebarchiesi@4
|
149 }
|
danielebarchiesi@4
|
150
|
danielebarchiesi@4
|
151 return $store;
|
danielebarchiesi@4
|
152 }
|
danielebarchiesi@4
|
153
|
danielebarchiesi@4
|
154 /**
|
danielebarchiesi@4
|
155 * Sets up an ARC2 RDF remote store.
|
danielebarchiesi@4
|
156 *
|
danielebarchiesi@4
|
157 * @param $endpoint
|
danielebarchiesi@4
|
158 * The remote SPARQL endpoint.
|
danielebarchiesi@4
|
159 * @return
|
danielebarchiesi@4
|
160 * An ARC2 store object.
|
danielebarchiesi@4
|
161 */
|
danielebarchiesi@4
|
162 function _sparql_init_remote_store($endpoint) {
|
danielebarchiesi@4
|
163 $endpoint_url = $endpoint->uri;
|
danielebarchiesi@4
|
164
|
danielebarchiesi@4
|
165 // If there are query parameters that need to be added before ARC2 processing,
|
danielebarchiesi@4
|
166 // add them here. Filter the array to remove empty values.
|
danielebarchiesi@4
|
167 if (isset($endpoint->options['query_parameters'])) {
|
danielebarchiesi@4
|
168 $endpoint_url = url($endpoint_url, array('query' => array_filter($endpoint->options['query_parameters'])));
|
danielebarchiesi@4
|
169 }
|
danielebarchiesi@4
|
170
|
danielebarchiesi@4
|
171 $config = array(
|
danielebarchiesi@4
|
172 /* remote endpoint */
|
danielebarchiesi@4
|
173 'remote_store_endpoint' => $endpoint_url,
|
danielebarchiesi@4
|
174 );
|
danielebarchiesi@4
|
175
|
danielebarchiesi@4
|
176 /* instantiation */
|
danielebarchiesi@4
|
177 $store = ARC2::getRemoteStore($config);
|
danielebarchiesi@4
|
178
|
danielebarchiesi@4
|
179 return $store;
|
danielebarchiesi@4
|
180 }
|