danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Functions for querying with SPARQL or extracting triples from an ARC2-style
|
danielebarchiesi@4
|
6 * data structure.
|
danielebarchiesi@4
|
7 */
|
danielebarchiesi@4
|
8
|
danielebarchiesi@4
|
9 function _rdfx_query_ask(&$model, $queries) {
|
danielebarchiesi@4
|
10 foreach ($queries as $query) {
|
danielebarchiesi@4
|
11 list($s, $p, $o) = $query;
|
danielebarchiesi@4
|
12 if (_rdfx_query_find_first($model, $s, $p, $o)) return true;
|
danielebarchiesi@4
|
13 }
|
danielebarchiesi@4
|
14 return false;
|
danielebarchiesi@4
|
15 }
|
danielebarchiesi@4
|
16
|
danielebarchiesi@4
|
17 function _rdfx_query_find_literal(&$model, $queries) {
|
danielebarchiesi@4
|
18 $literal = array();
|
danielebarchiesi@4
|
19 foreach ($queries as $query) {
|
danielebarchiesi@4
|
20 list($s, $p, $o) = $query;
|
danielebarchiesi@4
|
21 $triples = _rdfx_query_find_all($model, $s, $p, $o);
|
danielebarchiesi@4
|
22 // We create an associative array based on the language code of the
|
danielebarchiesi@4
|
23 // literal. The language codes Drupal uses are specified in includes/iso.inc.
|
danielebarchiesi@4
|
24 foreach ($triples as $triple) {
|
danielebarchiesi@4
|
25 if ($triple['o_lang'] !== '') {
|
danielebarchiesi@4
|
26 // Chinese and Portuguese are the only languages with a >2 letter
|
danielebarchiesi@4
|
27 // langcode.
|
danielebarchiesi@4
|
28 if (preg_match('/(zh-hans)|(zh-hant)|(pt-pt)|(pt-br)/', $triple['o_lang'])) {
|
danielebarchiesi@4
|
29 $langcode = $triple['o_lang'];
|
danielebarchiesi@4
|
30 }
|
danielebarchiesi@4
|
31 // Remove the region code if it is used (i.e. en-US is changed to en).
|
danielebarchiesi@4
|
32 else {
|
danielebarchiesi@4
|
33 $lang_array = explode('-', $triple['o_lang']);
|
danielebarchiesi@4
|
34 $langcode = !empty($lang_array[0]) ? $lang_array[0] : $triple['o_lang'];
|
danielebarchiesi@4
|
35 }
|
danielebarchiesi@4
|
36 }
|
danielebarchiesi@4
|
37 else {
|
danielebarchiesi@4
|
38 $langcode = 'und';
|
danielebarchiesi@4
|
39 }
|
danielebarchiesi@4
|
40 $literal[$langcode] = $triple['o'];
|
danielebarchiesi@4
|
41 }
|
danielebarchiesi@4
|
42 }
|
danielebarchiesi@4
|
43 return $literal;
|
danielebarchiesi@4
|
44 }
|
danielebarchiesi@4
|
45
|
danielebarchiesi@4
|
46 function _rdfx_query_find_uris(&$model, $queries) {
|
danielebarchiesi@4
|
47 $uris = array();
|
danielebarchiesi@4
|
48 foreach ($queries as $query) {
|
danielebarchiesi@4
|
49 list($s, $p, $o) = $query;
|
danielebarchiesi@4
|
50 $result = _rdfx_query_find_all($model, $s, $p, $o);
|
danielebarchiesi@4
|
51 foreach ($result as $triple) {
|
danielebarchiesi@4
|
52 if ($s == '?' && $triple['s_type'] == 'uri') {
|
danielebarchiesi@4
|
53 $uris[] = $triple['s'];
|
danielebarchiesi@4
|
54 }
|
danielebarchiesi@4
|
55 if ($p == '?') {
|
danielebarchiesi@4
|
56 $uris[] = $triple['p'];
|
danielebarchiesi@4
|
57 }
|
danielebarchiesi@4
|
58 if ($o == '?' && $triple['o_type'] == 'uri') {
|
danielebarchiesi@4
|
59 $uris[] = $triple['o'];
|
danielebarchiesi@4
|
60 }
|
danielebarchiesi@4
|
61 }
|
danielebarchiesi@4
|
62 }
|
danielebarchiesi@4
|
63 return array_unique($uris);
|
danielebarchiesi@4
|
64 }
|
danielebarchiesi@4
|
65
|
danielebarchiesi@4
|
66 function _rdfx_query_find_qnames(&$model, $queries) {
|
danielebarchiesi@4
|
67 $uris = _rdfx_query_find_uris($model, $queries);
|
danielebarchiesi@4
|
68 $qnames = array();
|
danielebarchiesi@4
|
69 foreach ($uris as $uri) {
|
danielebarchiesi@4
|
70 $qnames[] = $uri;
|
danielebarchiesi@4
|
71 }
|
danielebarchiesi@4
|
72 return $qnames;
|
danielebarchiesi@4
|
73 }
|
danielebarchiesi@4
|
74
|
danielebarchiesi@4
|
75 function _rdfx_query_find_first(&$model, $s, $p, $o) {
|
danielebarchiesi@4
|
76 foreach ($model as $triple) {
|
danielebarchiesi@4
|
77 if (!is_null($s) && $s != '?' && ($triple['s'] != $s || $triple['s_type'] != 'uri')) continue;
|
danielebarchiesi@4
|
78 if (!is_null($p) && $p != '?' && ($triple['p'] != $p)) continue;
|
danielebarchiesi@4
|
79 if (!is_null($o) && $o != '?' && ($triple['o'] != $o || $triple['o_type'] != 'uri')) continue;
|
danielebarchiesi@4
|
80 return $triple;
|
danielebarchiesi@4
|
81 }
|
danielebarchiesi@4
|
82 return null;
|
danielebarchiesi@4
|
83 }
|
danielebarchiesi@4
|
84
|
danielebarchiesi@4
|
85 function _rdfx_query_find_all(&$model, $s, $p, $o) {
|
danielebarchiesi@4
|
86 $result = array();
|
danielebarchiesi@4
|
87 foreach ($model as $triple) {
|
danielebarchiesi@4
|
88 if (!is_null($s) && $s != '?' && ($triple['s'] != $s)) continue;
|
danielebarchiesi@4
|
89 if (!is_null($p) && $p != '?' && ($triple['p'] != $p)) continue;
|
danielebarchiesi@4
|
90 if (!is_null($o) && $o != '?' && ($triple['o'] != $o)) continue;
|
danielebarchiesi@4
|
91 $result[] = $triple;
|
danielebarchiesi@4
|
92 }
|
danielebarchiesi@4
|
93 return $result;
|
danielebarchiesi@4
|
94 }
|