/** * @see superclass */ function getPropertySubjects(SMWPropertyValue $property, $value, $requestoptions = NULL) { if (!$property->isUserDefined()) { return parent::getPropertySubjects($property, $value, $requestoptions); } if (smwfCheckIfPredefinedSMWHaloProperty($property)) { return parent::getPropertyValues($subject, $property, $requestoptions, $outputformat); } global $smwgTripleStoreGraph; $client = TSConnection::getConnector(); $client->connect(); $values = array(); $propertyName = $property->getWikiPageValue()->getTitle()->getDBkey(); $limit = isset($requestoptions->limit) ? " LIMIT " . $requestoptions->limit : ""; $offset = isset($requestoptions->offset) ? " OFFSET " . $requestoptions->offset : ""; $nsPrefixProp = $this->tsNamespace->getNSPrefix($property->getWikiPageValue()->getTitle()->getNamespace()); try { if (is_null($value)) { $response = $client->query("SELECT ?s WHERE { GRAPH ?g { ?s <{$smwgTripleStoreGraph}/{$nsPrefixProp}#{$propertyName}> ?o. } } {$limit} {$offset}", "merge=false|graph={$smwgTripleStoreGraph}"); } else { if ($value instanceof SMWWikiPageValue) { $objectName = $value->getTitle()->getDBkey(); $nsPrefixObj = $this->tsNamespace->getNSPrefix($value->getTitle()->getNamespace()); $response = $client->query("SELECT ?s WHERE { GRAPH ?g { ?s <{$smwgTripleStoreGraph}/{$nsPrefixProp}#{$propertyName}> <{$smwgTripleStoreGraph}/{$nsPrefixObj}#{$objectName}>. } } {$limit} {$offset}", "merge=false"); } else { $objectvalue = str_replace('"', '\\"', array_shift($value->getDBkeys())); $objecttype = WikiTypeToXSD::getXSDType($value->getTypeID()); $response = $client->query("SELECT ?s WHERE { GRAPH ?g { ?s <{$smwgTripleStoreGraph}/{$nsPrefixProp}#{$propertyName}> \"{$objectvalue}\"^^{$objecttype}. } } {$limit} {$offset}", "merge=false"); } } } catch (Exception $e) { wfDebug("Triplestore does probably not run.\n"); $response = TSNamespaces::$EMPTY_SPARQL_XML; } // query global $smwgSPARQLResultEncoding; // PHP strings are always interpreted in ISO-8859-1 but may be actually encoded in // another charset. if (isset($smwgSPARQLResultEncoding) && $smwgSPARQLResultEncoding == 'UTF-8') { $response = utf8_decode($response); } $dom = simplexml_load_string($response); $annotations = array(); $results = $dom->xpath('//result'); foreach ($results as $r) { $children = $r->children(); // binding nodes $b = $children->binding[0]; // predicate $sv = $b->children()->uri[0]; $title = $this->getTitleFromURI((string) $sv); $value = SMWWikiPageValue::makePage($title->getDBkey(), $title->getNamespace()); $metadata = $sv->attributes(); foreach ($metadata as $mdProperty => $mdValue) { if (strpos($mdProperty, "_meta_") === 0) { $value->setMetadata(substr($mdProperty, 6), explode("|||", $mdValue)); } } $values[] = $value; } return $values; }
/** * Parses additinal semantic data need for a triple store: * * 1. categories * 2. rules (optional) */ function smwfTripleStoreParserHook(&$parser, &$text, &$strip_state = null) { global $smwgIP, $smwgTripleStoreGraph; global $wgContLang; include_once $smwgIP . '/includes/SMW_Factbox.php'; SMWTripleStore::$fullSemanticData = new SMWFullSemanticData(); $categoryText = $wgContLang->getNsText(NS_CATEGORY); // parse categories: $categoryLinkPattern = '/\\[\\[\\s* # Beginning of the link ' . $categoryText . '\\s*: # category link (case insensitive!) ([^\\[\\]]*) # category \\]\\] # End of link /ixu'; # case-insensitive, ignore whitespaces, UTF-8 compatible $categories = array(); $matches = array(); preg_match_all($categoryLinkPattern, $text, $matches); if (isset($matches[1])) { foreach ($matches[1] as $m) { $labelIndex = strpos($m, '|'); $m = $labelIndex !== false ? substr($m, 0, $labelIndex) : $m; $categories[] = Title::newFromText(trim($m), NS_CATEGORY); } } // parse redirects $redirectLinkPattern = '/\\#REDIRECT # REDIRECT command \\[\\[ # Beginning of the link ([^]]+) # target \\]\\] # End of link /ixu'; # case-insensitive, ignore whitespaces, UTF-8 compatible $redirects = array(); $matches = array(); preg_match_all($redirectLinkPattern, $text, $matches); if (isset($matches[1])) { foreach ($matches[1] as $m) { $redirects[] = Title::newFromText($m); } } SMWTripleStore::$fullSemanticData->setCategories($categories); SMWTripleStore::$fullSemanticData->setRedirects($redirects); return true; }