/** * Turn an array of SMWExpElements into an RDF collection. * * @param $elements array of SMWExpElement * @return SMWExpData */ public static function makeCollection(array $elements) { if (count($elements) == 0) { return new SMWExpData(SMWExporter::getSpecialNsResource('rdf', 'nil')); } else { $rdftype = SMWExporter::getSpecialNsResource('rdf', 'type'); $rdffirst = SMWExporter::getSpecialNsResource('rdf', 'first'); $rdfrest = SMWExporter::getSpecialNsResource('rdf', 'rest'); $result = new SMWExpData(new SMWExpResource('')); // bnode $result->addPropertyObjectValue($rdftype, new SMWExpData(SMWExporter::getSpecialNsResource('rdf', 'List'))); $result->addPropertyObjectValue($rdffirst, array_shift($elements)); $result->addPropertyObjectValue($rdfrest, SMWExpData::makeCollection($elements)); return $result; } }
public function descriptionToExpData($desc, &$exact) { if ($desc instanceof SMWConjunction || $desc instanceof SMWDisjunction) { $result = new SMWExpData(new SMWExpResource('')); $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('rdf', 'type'), new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Class'))); $elements = array(); foreach ($desc->getDescriptions() as $subdesc) { $element = $this->descriptionToExpData($subdesc, $exact); if ($element === false) { $element = new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Thing')); } $elements[] = $element; } $prop = $desc instanceof SMWConjunction ? 'intersectionOf' : 'unionOf'; $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('owl', $prop), SMWExpData::makeCollection($elements)); } elseif ($desc instanceof SMWClassDescription) { if (count($desc->getCategories()) == 1) { // single category $result = new SMWExpData(SMWExporter::getResourceElement(end($desc->getCategories()))); } else { // disjunction of categories $result = new SMWExpData(new SMWExpResource('')); $elements = array(); foreach ($desc->getCategories() as $cat) { $elements[] = new SMWExpData(SMWExporter::getResourceElement($cat)); } $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('owl', 'unionOf'), SMWExpData::makeCollection($elements)); } $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('rdf', 'type'), new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Class'))); } elseif ($desc instanceof SMWConceptDescription) { $result = new SMWExpData(SMWExporter::getResourceElement($desc->getConcept())); } elseif ($desc instanceof SMWSomeProperty) { $result = new SMWExpData(new SMWExpResource('')); $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('rdf', 'type'), new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Restriction'))); $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('owl', 'onProperty'), new SMWExpData(SMWExporter::getResourceElement($desc->getProperty()))); $subdata = $this->descriptionToExpData($desc->getDescription(), $exact); if ($desc->getDescription() instanceof SMWValueDescription && $desc->getDescription()->getComparator() == SMW_CMP_EQ) { $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('owl', 'hasValue'), $subdata); } else { if ($subdata === false) { $owltype = SMWExporter::getOWLPropertyType($desc->getProperty()->getPropertyTypeID()); if ($owltype == 'ObjectProperty') { $subdata = new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Thing')); } elseif ($owltype == 'DatatypeProperty') { $subdata = new SMWExpData(SMWExporter::getSpecialNsResource('rdfs', 'Literal')); } else { // no restrictions at all with annotation properties ... return new SMWExpData(SMWExporter::getSpecialNsResource('owl', 'Thing')); } } $result->addPropertyObjectValue(SMWExporter::getSpecialNsResource('owl', 'someValuesFrom'), $subdata); } } elseif ($desc instanceof SMWValueDescription) { if ($desc->getComparator() == SMW_CMP_EQ) { $result = SMWExporter::getDataItemExpElement($desc->getDataItem()); } else { // alas, OWL cannot represent <= and >= ... $exact = false; $result = false; } } elseif ($desc instanceof SMWThingDescription) { $result = false; } else { $result = false; $exact = false; } return $result; }
private function doMapConjunctionDisjunction(Description $description, &$exact) { $result = new ExpData(new ExpResource('')); $result->addPropertyObjectValue($this->exporter->getSpecialNsResource('rdf', 'type'), new ExpData($this->exporter->getSpecialNsResource('owl', 'Class'))); $elements = array(); foreach ($description->getDescriptions() as $subdesc) { $element = $this->getExpDataFromDescription($subdesc, $exact); if ($element === false) { $element = new ExpData($this->exporter->getSpecialNsResource('owl', 'Thing')); } $elements[] = $element; } $prop = $description instanceof Conjunction ? 'intersectionOf' : 'unionOf'; $result->addPropertyObjectValue($this->exporter->getSpecialNsResource('owl', $prop), ExpData::makeCollection($elements)); return $result; }