danielebarchiesi@4: fields('rdft', array('tid')) danielebarchiesi@4: ->condition('rdftt.type', $types, 'IN'); danielebarchiesi@4: $query->join('rdfx_terms', 'rdft', 'rdftt.tid = rdft.tid'); danielebarchiesi@4: $query->join('rdfx_namespaces', 'rdfns', 'rdfns.nsid = rdft.nsid'); danielebarchiesi@4: $query->join('rdfx_vocabulary_graphs', 'rdfvg', 'rdfvg.main_ns = rdfns.nsid'); danielebarchiesi@4: $terms = $query->execute()->fetchCol(); danielebarchiesi@4: return $terms; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Gets a list of all defined namespaces. danielebarchiesi@4: */ danielebarchiesi@4: function rdfx_get_namespaces() { danielebarchiesi@4: $rdf_namespaces = &drupal_static(__FUNCTION__); danielebarchiesi@4: if (empty($rdf_namespaces)) { danielebarchiesi@4: $rdf_namespaces = rdf_get_namespaces(); danielebarchiesi@4: } danielebarchiesi@4: return $rdf_namespaces; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_rdf_namespaces. danielebarchiesi@4: */ danielebarchiesi@4: function rdfx_rdf_namespaces() { danielebarchiesi@4: // Starts with some additionnal common namespaces which core does not include. danielebarchiesi@4: $ns_mappings = array( danielebarchiesi@4: 'owl' => 'http://www.w3.org/2002/07/owl#', danielebarchiesi@4: 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', danielebarchiesi@4: 'rss' => 'http://purl.org/rss/1.0/', danielebarchiesi@4: // url() does not support empty fragment. danielebarchiesi@4: 'site' => url('ns', array('absolute' => TRUE)) . '#', danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Gets the custom namespaces stored in the database. danielebarchiesi@4: $query = db_select('rdfx_vocabulary_graphs', 'g'); danielebarchiesi@4: $query->fields('n', array('prefix', 'uri')); danielebarchiesi@4: $query->join('rdfx_namespaces', 'n', 'g.main_ns = n.nsid'); danielebarchiesi@4: $query->orderBy('n.prefix'); danielebarchiesi@4: $namespaces = $query->execute()->fetchAllKeyed(); danielebarchiesi@4: foreach ($namespaces as $prefix => $uri) { danielebarchiesi@4: $ns_mappings[$prefix] = $uri; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return $ns_mappings; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves the main namespace mapping for a vocabulary graph and the additional danielebarchiesi@4: * namespace mappings as defined in the document. danielebarchiesi@4: */ danielebarchiesi@4: function _rdfx_save_vocabulary($main_ns, $main_ns_prefix, $vocabulary) { danielebarchiesi@4: $current_time = REQUEST_TIME; danielebarchiesi@4: // If the vocabulary URI matches the main_ns of a vocabulary source, then danielebarchiesi@4: // this is an update to that record. Otherwise, this is a newly imported danielebarchiesi@4: // source. danielebarchiesi@4: $gid = rdfx_get_gid($main_ns); danielebarchiesi@4: danielebarchiesi@4: // If there is an existing vocabulary, make sure that the main_ns is in the danielebarchiesi@4: // namespaces array and that the user defined mapping is the last in the danielebarchiesi@4: // array so the prefix reflects the user definition. Also change the danielebarchiesi@4: // vocabulary graph updated date. danielebarchiesi@4: if ($gid) { danielebarchiesi@4: $vocabulary['namespaces'][$main_ns_prefix] = $main_ns; danielebarchiesi@4: db_update('rdfx_vocabulary_graphs') danielebarchiesi@4: ->fields(array('date_updated' => $current_time,)) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // If this is a new vocabulary, create a graph with a main namespace and danielebarchiesi@4: // add the additional namespaces. danielebarchiesi@4: else { danielebarchiesi@4: // @todo If the vocab URI isn't used in any terms, don't add it to ns table. danielebarchiesi@4: // This may happen where multiple files are defining a vocabulary. danielebarchiesi@4: danielebarchiesi@4: // @todo This should be handled as a transaction in case there is an error danielebarchiesi@4: // in the middle. If there is an error, then there will be an SQL error danielebarchiesi@4: // when the user retries the import. danielebarchiesi@4: danielebarchiesi@4: // Insert this namespace to get the nsid. The vocabulary_source entry will danielebarchiesi@4: // point to this nsid for the main_ns. We temporarily insert 0 for the gid, danielebarchiesi@4: // then update when we have the real gid. danielebarchiesi@4: $nsid = db_insert('rdfx_namespaces') danielebarchiesi@4: ->fields(array('uri' => $main_ns, 'prefix' => $main_ns_prefix, 'gid' => '0')) danielebarchiesi@4: ->execute(); danielebarchiesi@4: $gid = db_insert('rdfx_vocabulary_graphs') danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'main_ns' => $nsid, danielebarchiesi@4: 'date_created' => $current_time, danielebarchiesi@4: 'date_updated' => $current_time,)) danielebarchiesi@4: ->execute(); danielebarchiesi@4: db_update('rdfx_namespaces') danielebarchiesi@4: ->condition('nsid', $nsid) danielebarchiesi@4: ->fields(array('gid' => $gid)) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: // Insert/update the vocabulary title. danielebarchiesi@4: if (count($vocabulary['title']) > 0) { danielebarchiesi@4: foreach ($vocabulary['title'] as $langcode => $title) { danielebarchiesi@4: $query = db_merge('rdfx_vocabulary_details') danielebarchiesi@4: ->key(array('gid' => $gid, 'language' => $langcode)) danielebarchiesi@4: ->fields(array('language' => $langcode, 'label' => $title)); danielebarchiesi@4: $status = $query->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Insert/update the vocabulary description. danielebarchiesi@4: if (count($vocabulary['description']) > 0) { danielebarchiesi@4: foreach ($vocabulary['description'] as $langcode => $description) { danielebarchiesi@4: $query = db_merge('rdfx_vocabulary_details') danielebarchiesi@4: ->key(array('gid' => $gid, 'language' => $langcode)) danielebarchiesi@4: ->fields(array('language' => $langcode, 'description' => $description)); danielebarchiesi@4: $status = $query->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Insert/update the other namespace mappings used in this vocabulary graph. danielebarchiesi@4: if (count($vocabulary['namespaces']) > 0) { danielebarchiesi@4: foreach ($vocabulary['namespaces'] as $prefix => $namespace) { danielebarchiesi@4: if ($namespace != $main_ns) { danielebarchiesi@4: $query = db_merge('rdfx_namespaces') danielebarchiesi@4: ->key(array('gid' => $gid, 'uri' => $namespace)) danielebarchiesi@4: ->fields(array('uri' => $namespace, 'prefix' => $prefix, 'gid' => $gid)) danielebarchiesi@4: ->updateFields(array('prefix' => $prefix)); danielebarchiesi@4: $status = $query->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $nsids = rdfx_get_nsids($main_ns); danielebarchiesi@4: return $nsids; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves vocabulary terms. danielebarchiesi@4: */ danielebarchiesi@4: function rdfx_save_terms($vocabulary_uri, $prefix, $vocabulary) { danielebarchiesi@4: $nsids = _rdfx_save_vocabulary($vocabulary_uri, $prefix, $vocabulary); danielebarchiesi@4: foreach ($vocabulary['terms'] as $term_type => $terms) { danielebarchiesi@4: foreach ($terms as $term_uri => $term_description) { danielebarchiesi@4: list($term_ns, $term_local_name) = rdfx_split_uri($term_uri); danielebarchiesi@4: if (isset($nsids[$term_ns])) { danielebarchiesi@4: $nsid = $nsids[$term_ns]; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: // If the namespace wasn't mapped to a prefix in the source graph, we danielebarchiesi@4: // didn't save it to the namespaces table, so we need to add an entry. danielebarchiesi@4: danielebarchiesi@4: // @todo For the prefix value, we save the URI... should this be changed? danielebarchiesi@4: $gid = rdfx_get_gid($vocabulary_uri); danielebarchiesi@4: $nsid = db_insert('rdfx_namespaces') danielebarchiesi@4: ->fields(array('uri' => $term_ns, 'prefix' => $term_ns, 'gid' => $gid)) danielebarchiesi@4: ->execute(); danielebarchiesi@4: $nsids[$term_ns] = $nsid; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Get the tid of this term, saving to {rdfx_terms} if not already there. danielebarchiesi@4: $tid = db_query("SELECT tid FROM {rdfx_terms} WHERE nsid = :nsid AND local_name = :localname", array(':nsid' => $nsid, ':localname' => $term_local_name))->fetchField(); danielebarchiesi@4: if ($tid == NULL) { danielebarchiesi@4: $tid = db_insert('rdfx_terms') danielebarchiesi@4: ->fields(array('nsid', 'local_name')) danielebarchiesi@4: ->values(array( danielebarchiesi@4: 'nsid' => $nsid, danielebarchiesi@4: 'local_name' => $term_local_name, danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Add the current type to this term in {rdfx_term_types}. danielebarchiesi@4: db_merge('rdfx_term_types') danielebarchiesi@4: ->key(array('tid' => $tid, 'type' => $term_type)) danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'tid' => $tid, danielebarchiesi@4: 'type' => $term_type, danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: danielebarchiesi@4: // Add label and comment to {rdfx_term_details}. danielebarchiesi@4: $term_details = array(); danielebarchiesi@4: if (isset($term_description['label'])) { danielebarchiesi@4: foreach ($term_description['label'] as $lang => $text) { danielebarchiesi@4: $term_details[$lang]['label'] = $text; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if (isset($term_description['comment'])) { danielebarchiesi@4: foreach ($term_description['comment'] as $lang => $text) { danielebarchiesi@4: $term_details[$lang]['comment'] = $text; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if (!empty($term_details)) { danielebarchiesi@4: foreach ($term_details as $lang => $details) { danielebarchiesi@4: db_merge('rdfx_term_details') danielebarchiesi@4: ->key(array('tid' => $tid, 'language' => $lang)) danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'tid' => $tid, danielebarchiesi@4: 'language' => $lang, danielebarchiesi@4: 'label' => isset($details['label']) ? $details['label'] : NULL, danielebarchiesi@4: 'comment' => isset($details['comment']) ? $details['comment'] : NULL, danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Add relationships to their respective tables. This is handled as a danielebarchiesi@4: // complicated set of loops to reduce code duplication. To add a new danielebarchiesi@4: // relationship, just add the array key that is used in danielebarchiesi@4: // $types['properties']['description'] to define the relationship, and danielebarchiesi@4: // then add the name of the table that stores the relationship. danielebarchiesi@4: $relationships = array( danielebarchiesi@4: 'domain' => 'rdfx_term_domains', danielebarchiesi@4: 'range' => 'rdfx_term_ranges', danielebarchiesi@4: ); danielebarchiesi@4: foreach ($relationships as $relationship => $table_name) { danielebarchiesi@4: if (isset($term_description[$relationship])) { danielebarchiesi@4: foreach ($term_description[$relationship] as $related_term) { danielebarchiesi@4: $related_term_tid = rdfx_get_tid($related_term, $vocabulary_uri); danielebarchiesi@4: if ($related_term_tid) { danielebarchiesi@4: db_merge($table_name) danielebarchiesi@4: ->key(array('tid' => $tid, $relationship . '_tid' => $related_term_tid)) danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'tid' => $tid, danielebarchiesi@4: $relationship . '_tid' => $related_term_tid, danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: // @todo Add a hook that passes the $vocabulary and the $model. danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Returns metadata about term types defined by rdf modules. danielebarchiesi@4: * danielebarchiesi@4: * If your module needs to determine what term types are being supplied by danielebarchiesi@4: * other modules, call this function. Querying rdfx database tables directly danielebarchiesi@4: * for this information is discouraged. Any additional term types should be danielebarchiesi@4: * added through the corresponding alter hook. danielebarchiesi@4: * danielebarchiesi@4: * Three major bins of data are stored: tags, value_types, and functions. Each danielebarchiesi@4: * entry in these bins is keyed by the value stored in the actual VotingAPI danielebarchiesi@4: * tables, and contains an array with (minimally) 'name' and 'description' keys. danielebarchiesi@4: * Modules can add extra keys to their entries if desired. danielebarchiesi@4: * danielebarchiesi@4: * This metadata can be modified or expanded using hook_rdfx_term_types_alter(). danielebarchiesi@4: * danielebarchiesi@4: * @return danielebarchiesi@4: * An array of metadata defined by RDFx Terms and altered by rdf modules. danielebarchiesi@4: * danielebarchiesi@4: * @see hook_rdfx_term_types_alter() danielebarchiesi@4: * danielebarchiesi@4: * Modeled on VotingAPI votingapi_metadata. danielebarchiesi@4: */ danielebarchiesi@4: function rdfx_term_types($reset = FALSE) { danielebarchiesi@4: static $types; danielebarchiesi@4: if ($reset || !isset($types)) { danielebarchiesi@4: $types['classes']['term_types'] = array(); danielebarchiesi@4: $types['properties']['term_types'] = array(); danielebarchiesi@4: danielebarchiesi@4: $term_details = ''; danielebarchiesi@4: danielebarchiesi@4: // @todo Should the inference consider subProp and subClass relationships danielebarchiesi@4: // as well. ie. should all OWL classes also have the type RDFS Class danielebarchiesi@4: danielebarchiesi@4: // @todo Switch to drupal cache danielebarchiesi@4: $types['classes']['term_types'] = array( danielebarchiesi@4: 'rdfs_class' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2000/01/rdf-schema#Class', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#subClassOf' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#domain' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#range' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_class' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#Class', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#equivalentClass' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#disjointWith' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $types['properties']['term_types'] = array ( danielebarchiesi@4: 'rdf_property' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#Property', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#domain' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#range' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#subPropertyOf' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#equivalentProperty' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#inverseOf' => array( danielebarchiesi@4: 'subject', danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_datatype' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#DatatypeProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_object' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#ObjectProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_functional' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#FunctionalProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_inverse_functional' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#InverseFunctionalProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_symmetric' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#SymmetricProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_asymmetric' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#AsymmetricProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_annotation' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#AnnotationProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_reflexive' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#ReflexiveProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_irreflexive' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#IrreflexiveProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'owl_property_transitive' => array( danielebarchiesi@4: 'uri' => 'http://www.w3.org/2002/07/owl#TransitiveProperty', danielebarchiesi@4: 'inference' => array( danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $types['classes']['description'] = array( danielebarchiesi@4: 'superclass' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#subClassOf' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'disjoint' => array( danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#disjointWith' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $types['properties']['description'] = array( danielebarchiesi@4: 'domain' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#domain' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'range' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#range' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'superproperty' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#subPropertyOf' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'inverse' => array( danielebarchiesi@4: 'http://www.w3.org/2002/07/owl#inverseOf' => array( danielebarchiesi@4: 'object', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: drupal_alter('rdfx_term_types', $types); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return $types; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Splits a URI into namespace and localpart. danielebarchiesi@4: */ danielebarchiesi@4: function rdfx_split_uri ($uri) { danielebarchiesi@4: $parts = ARC2::splitURI($uri); danielebarchiesi@4: return $parts; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfx_get_tid($term_uri, $graph_main_ns) { danielebarchiesi@4: $nsids = rdfx_get_nsids($graph_main_ns); danielebarchiesi@4: list($term_ns, $term_local_name) = rdfx_split_uri($term_uri); danielebarchiesi@4: if (isset($nsids[$term_ns])) { danielebarchiesi@4: $tid = db_query("SELECT tid FROM {rdfx_terms} WHERE nsid = :nsid AND local_name = :localname", array(':nsid' => $nsids[$term_ns], ':localname' => $term_local_name))->fetchField(); danielebarchiesi@4: return $tid; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: return NULL; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfx_get_gid($main_ns) { danielebarchiesi@4: $gids = db_select('rdfx_namespaces', 'rdfns', array()); danielebarchiesi@4: $gids->join('rdfx_vocabulary_graphs', 'rdfvg', 'rdfvg.main_ns = rdfns.nsid'); danielebarchiesi@4: $gids danielebarchiesi@4: ->fields('rdfns', array('gid')) danielebarchiesi@4: ->condition('rdfns.uri', $main_ns); danielebarchiesi@4: // @todo There should only be one result if there is a matching vocab source. danielebarchiesi@4: // However, perhaps we should test to make sure and throw an error? danielebarchiesi@4: $gid = $gids->execute()->fetchField(); danielebarchiesi@4: return $gid; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfx_get_nsids($main_ns) { danielebarchiesi@4: $gid = rdfx_get_gid($main_ns); danielebarchiesi@4: $nsids = db_query("SELECT uri, nsid FROM {rdfx_namespaces} WHERE gid = :gid", array(':gid' => $gid))->fetchAllKeyed(); danielebarchiesi@4: return $nsids; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfx_curie($tid) { danielebarchiesi@4: $query = db_select('rdfx_terms', 'rdft') danielebarchiesi@4: ->fields('rdft', array('local_name')) danielebarchiesi@4: ->fields('rdfns', array('prefix')) danielebarchiesi@4: ->condition('rdft.tid', $tid, '='); danielebarchiesi@4: $query->join('rdfx_namespaces', 'rdfns', 'rdfns.nsid = rdft.nsid'); danielebarchiesi@4: $result = $query->execute()->fetch(); danielebarchiesi@4: $curie = $result->prefix . ':' . $result->local_name; danielebarchiesi@4: return $curie; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function _rdfx_get_term_details($tid, $langcode = 'und') { danielebarchiesi@4: $query_language = db_query("SELECT language FROM {rdfx_term_details} WHERE tid = :tid", array(':tid' => $tid)); danielebarchiesi@4: $languages = $query_language->fetchCol(); danielebarchiesi@4: if (!in_array($langcode, $languages)) { danielebarchiesi@4: if (in_array('und', $languages)) { danielebarchiesi@4: $langcode = 'und'; danielebarchiesi@4: } danielebarchiesi@4: elseif (in_array('en', $languages)) { danielebarchiesi@4: $langcode = 'en'; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: return; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $query = db_select('rdfx_term_details', 'rdfd') danielebarchiesi@4: ->fields('rdfd', array('label', 'comment')) danielebarchiesi@4: ->condition('rdfd.tid', $tid, '=') danielebarchiesi@4: ->condition('language', $langcode, '='); danielebarchiesi@4: $details = $query->execute()->fetch(); danielebarchiesi@4: return $details; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Queries a set of triples for classes and properties, and builds danielebarchiesi@4: * an associative array describing the vocabulary and any danielebarchiesi@4: * classes and properties found. danielebarchiesi@4: * danielebarchiesi@4: * @param array $model An ARC2-style array of triples an RDFS vocabulary or OWL ontology danielebarchiesi@4: * @param array $namespaces Associative array of namespaces parsed from the RDF file danielebarchiesi@4: * @param string $ns_prefix Namespace prefix for the vocabulary danielebarchiesi@4: * @param string $ns_uri Only terms in this namespace will be considered danielebarchiesi@4: * @return array Array describing the vocabulary, its classes and properties. danielebarchiesi@4: */ danielebarchiesi@4: function _rdfx_extract_schema(&$model, $namespaces, $ns_prefix, $ns_uri) { danielebarchiesi@4: $vocabulary_details = _rdfx_get_vocabulary_details($model, $ns_uri); danielebarchiesi@4: $terms = _rdfx_fetch_terms($model); danielebarchiesi@4: $vocabulary = array( danielebarchiesi@4: 'uri' => $ns_uri, danielebarchiesi@4: 'title' => $vocabulary_details['title'], danielebarchiesi@4: 'description' => $vocabulary_details['description'], danielebarchiesi@4: 'terms' => $terms, danielebarchiesi@4: 'namespaces' => $namespaces, danielebarchiesi@4: ); danielebarchiesi@4: return $vocabulary; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function _rdfx_fetch_terms(&$model) { danielebarchiesi@4: $terms = array(); danielebarchiesi@4: $term_uris = array(); danielebarchiesi@4: danielebarchiesi@4: // Retrieve the queries for term retrieval. This may have been modified by danielebarchiesi@4: // other modules. danielebarchiesi@4: $term_type_groups = rdfx_term_types(); danielebarchiesi@4: danielebarchiesi@4: foreach($term_type_groups as $term_type_group => $group) { danielebarchiesi@4: foreach ($group['term_types'] as $term_type => $term) { danielebarchiesi@4: $query = array( danielebarchiesi@4: array('?', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type', $term['uri']), danielebarchiesi@4: ); danielebarchiesi@4: foreach ($term['inference'] as $inference_uri => $query_types) { danielebarchiesi@4: foreach ($query_types as $query_type) { danielebarchiesi@4: switch ($query_type) { danielebarchiesi@4: case 'subject': danielebarchiesi@4: $query[] = array('?', $inference_uri, null); danielebarchiesi@4: break; danielebarchiesi@4: case 'object': danielebarchiesi@4: $query[] = array(null, $inference_uri, '?'); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $term_uris[$term_type] = _rdfx_query_find_uris($model, $query); danielebarchiesi@4: danielebarchiesi@4: // Add term details and various relationships for each term, as defined danielebarchiesi@4: // in rdfx_term_types() and altered by hook_rdfx_term_types_alter(). danielebarchiesi@4: $query_x = array(); danielebarchiesi@4: foreach ($term_uris[$term_type] as $term_uri) { danielebarchiesi@4: danielebarchiesi@4: $terms[$term_type][$term_uri] = _evoc_query_for_term_description($model, $term_uri); danielebarchiesi@4: foreach ($group['description'] as $property => $queries) { danielebarchiesi@4: foreach ($queries as $predicate_uri => $query_types) { danielebarchiesi@4: foreach ($query_types as $query_type) { danielebarchiesi@4: switch ($query_type) { danielebarchiesi@4: case 'subject': danielebarchiesi@4: $query_x[$term_uri][$property][] = array('?', $predicate_uri, $term_uri); danielebarchiesi@4: break; danielebarchiesi@4: case 'object': danielebarchiesi@4: $query_x[$term_uri][$property][] = array($term_uri, $predicate_uri, '?'); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $terms[$term_type][$term_uri][$property] = _rdfx_query_find_uris($model, $query_x[$term_uri][$property]); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return $terms; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function _rdfx_get_vocabulary_details(&$model, $ns_uri) { danielebarchiesi@4: $query_predicates = array( danielebarchiesi@4: 'title' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#label', danielebarchiesi@4: 'http://purl.org/dc/elements/1.1/title', danielebarchiesi@4: 'http://purl.org/dc/terms/title', danielebarchiesi@4: ), danielebarchiesi@4: 'description' => array( danielebarchiesi@4: 'http://www.w3.org/2000/01/rdf-schema#comment', danielebarchiesi@4: 'http://purl.org/dc/elements/1.1/description', danielebarchiesi@4: 'http://purl.org/dc/terms/description', danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: if (substr($ns_uri, -1) == '#') { danielebarchiesi@4: $uri = substr($ns_uri, 0, -1); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: foreach ($query_predicates as $query_element => $predicates) { danielebarchiesi@4: foreach ($predicates as $predicate) { danielebarchiesi@4: $queries[$query_element][] = array($ns_uri, $predicate, '?'); danielebarchiesi@4: // if ($uri !== NULL) { danielebarchiesi@4: // $queries[$query_element][] = array($uri, $predicate, '?'); danielebarchiesi@4: // } danielebarchiesi@4: } danielebarchiesi@4: $details[$query_element] = _rdfx_query_find_literal($model, $queries[$query_element]); danielebarchiesi@4: } danielebarchiesi@4: return $details; danielebarchiesi@4: }