Log in Help
Print
Homereleasesgate-5.1-beta2-build3402-ALLpluginsGazetteer_Ontology_Basedsrcgatecloneqlqueryserql 〉 SerqlUtils.java
 
/*
 *  SerqlUtils.java
 *
 *  Copyright (c) 1998-2008, The University of Sheffield.
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 */
package gate.clone.ql.query.serql;

import java.io.IOException;

import java.util.HashSet;
import java.util.Set;

import gate.clone.ql.CATConstants;
import gate.creole.ontology.GateOntologyException;
import gate.creole.ontology.OConstants.QueryLanguage;
import gate.creole.ontology.Ontology;
import gate.creole.ontology.OntologyTupleQuery;
import gate.creole.ontology.OConstants.RDF;
import gate.creole.ontology.OConstants.RDFS;
import gate.creole.ontology.OConstants.OWL;
//import org.openrdf.model.vocabulary.OWL;
//import org.openrdf.model.vocabulary.RDF;
//import org.openrdf.model.vocabulary.RDFS;


/**
 * This class executes queries against the ontology with which it is initialized
 * first using SerqlUtils.init(Ontology o) method.
 * 
 * @author Danica Damljanovic
 * 
 */
public class SerqlUtils {

  // public static Ontology ontology;

  // public static SesameRepository myRepository;

  // public static QueryResultsTable resultsTable = null;

  // public static void init(Ontology o) {
  // ontology = o;
  // myRepository = ontology.getSesameRepository();
  // }
  /**
   * Method for retrieving labels of all resources
   * 
   * @return a table with 2 columns: first one is a URI of a resource and the
   *         second one is the value for its label.
   */
  public static String getLabels(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct x, z " + "from " + " {x} y {z} where y=<" + RDFS.LABEL
        + "> ";
    return ontology.executeQuery(query);
  }

  /**
   * Method for retrieving instances and their properties
   * 
   * @return a table with 3 columns: first column is instance URI, second column
   *         is property URI that is assigned to that instance, third column
   *         with a value of that property for that instance.
   */
  public static String getInstances(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct x, y, z " + "from {x} rdf:type {} "
        + "rdf:type {<http://www.w3.org/2002/07/owl#Class>},"
        + " {x} y {z}, {y} rdf:type {<" + RDF.PROPERTY + ">} "
        + "WHERE EXISTS (SELECT * FROM " + " {x} y {z}) and isLiteral(z)";
    return ontology.executeQuery(query);
  }

  /**
   * TMethod for retrieving properties and their properties
   * 
   * @return table where: first column is property uri, second column is
   *         property uri that is assigned to the property in the first column,
   *         third column with a value of the property for the property uri.
   */
  public static String getPropertiesOfProperties(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct y, m, n " + "from {y} rdf:type {<" + RDF.PROPERTY
        + ">}, " + "{y} m {n}, {m} rdf:type {<" + RDF.PROPERTY + ">}"
        + "WHERE exists " + "(select * from {y} m {n})  and isLiteral(n)";
    return ontology.executeQuery(query);
  }

  /**
   * Method for retrieving classes and their properties
   * 
   * @return table where: first column is class uri, second column is property
   *         uri that is assigned to the first class uri, third column with a
   *         value of the property for the class uri.
   * @throws GateOntologyException
   */
  public static String getClasses(Ontology ontology)
    throws GateOntologyException {
    String query =
      "SELECT DISTINCT x,y,z "
        + "from {x} rdf:type {<http://www.w3.org/2002/07/owl#Class>}, "
        + " {x} y {z}, {y} rdf:type {<" + RDF.PROPERTY + ">} "
        + "WHERE EXISTS (SELECT * FROM " + " {x} y {z}) and isLiteral(z)";
    return ontology.executeQuery(query);
  }

  /**
   * This method is retrieving instance types: classes which are being
   * instantiated by the instances.
   * 
   * @return the table with two columns: first is instace uri, second is class
   *         uri representing the type of the instance.
   * @throws GateOntologyException
   */
  public static String getInstanceTypes(Ontology ontology)
    throws GateOntologyException {
    String query =
      "SELECT DISTINCT x,y " + "from {x} serql:directType {y} "
        + "rdf:type {<http://www.w3.org/2002/07/owl#Class>}";
    return ontology.executeQuery(query);
  }

  /**
   * This method retrieves all instance URIs
   * 
   * @return the table with one column which is instance uris from the ontology
   *         this class is initialized to work with.
   */
  public static String getInstanceURIs(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct x" + " from {x} rdf:type {} "
        + "rdf:type {<http://www.w3.org/2002/07/owl#Class>}";
    return ontology.executeQuery(query);
  }

  /**
   * This method retrieves property URIs
   * 
   * @return the table with one column which is property uris from the ontology
   *         this class is initialized to work with.
   */
  public static String getPropertyURIs(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct y " + "from {y} rdf:type {<" + OWL.DATATYPEPROPERTY
        + ">} union ";

    String query2 =
      "Select distinct y " + "from {y} rdf:type {<" + OWL.OBJECTPROPERTY + ">}";
    return ontology.executeQuery(query + query2);
  }

  /**
   * This method retrieves URIs of all Object Properties
   * 
   * @return the table with one column which is object property uris from the
   *         ontology this class is initialized to work with.
   */
  public static String getObjectPropertyURIs(Ontology ontology)
    throws GateOntologyException {

    String query =
      "Select distinct y " + "from {y} rdf:type {<" + OWL.OBJECTPROPERTY + ">}";
    return ontology.executeQuery(query);
  }

  /**
   * This method retrieves URIs of classes
   * 
   * @return the table with one column which is class uris from the ontology
   *         this class is initialized to work with.
   * @throws GateOntologyException
   */
  public static String getClassURIs(Ontology ontology)
    throws GateOntologyException {
    String query =
      "SELECT DISTINCT x"
        + " from {x} rdf:type {<http://www.w3.org/2002/07/owl#Class>}";
    return ontology.executeQuery(query);
  }

  /**
   * This method is excluded from using at the moment as it is replaced by more
   * generic ones getPropertyRange and getPropertyDomain
   * 
   * @param firstUri
   * @param secondUri
   * @return
   * @throws GateOntologyException
   */
  public static String getRelationsBtwTwoResourcesIsTakingTooMuchTime(
    String firstUri, String secondUri, Ontology ontology)
    throws GateOntologyException {

    String rangeQueryRep = "{<" + secondUri + ">}";
    String domainQueryRep = "{<" + firstUri + ">}";

    String rangeClasses =
      "SELECT DISTINCT Parent FROM " + rangeQueryRep
        + "rdfs:subClassOf {Parent}";

    String domainClasses =
      "SELECT DISTINCT Parent FROM " + domainQueryRep
        + "rdfs:subClassOf {Parent}";

    String queryDomain =
      "select distinct p, x " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:domain {y}, " + "     {p} rdfs:domain {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y in ("
        + domainClasses + ") and x in (" + domainClasses + ")" + " MINUS "
        + "select distinct p,y " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:domain {y}, " + "     {p} rdfs:domain {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y in ("
        + domainClasses + ") and x in (" + domainClasses + ")  and x!=y";

    String domainAddition =
      " select distinct p, x" + " from {p} rdfs:domain {x}" + " where x=<"
        + firstUri + "> ";

    String rangeAddition =
      " select distinct p, x" + " from {p} rdfs:range {x}" + " where x=<"
        + secondUri + "> ";

    String queryRange =
      "select distinct p, x " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:range {y}, " + "     {p} rdfs:range {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y in ("
        + rangeClasses + ") and x in (" + rangeClasses + ")" + " MINUS "
        + "select distinct p, y " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:range {y}, " + "     {p} rdfs:range {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y in ("
        + rangeClasses + ") and x in (" + rangeClasses + ") and x!=y";// +

    Set<String> intersectionList = new HashSet<String>();

    Set<String> domainList = new HashSet<String>();
    // resultsTable = myRepository.performTableQuery(QueryLanguage.SERQL,
    // queryDomain);//
    String domainProps = ontology.executeQuery(queryDomain);
    String[] rows = domainProps.split("\n");
    for(String row : rows) {
      String[] cols = row.split("\\|");
      String prop = cols[0].trim();
      if(prop.indexOf("#") > -1) domainList.add(prop);
    }
    // resultsTable = myRepository.performTableQuery(QueryLanguage.SERQL,
    // queryRange);// + " union "+rangeAddition);
    String rangeProps = ontology.executeQuery(queryRange);
    rows = rangeProps.split("\n");
    for(String row : rows) {
      String[] cols = row.split("\\|");
      String prop = cols[0].trim();
      if(domainList.contains(prop)) intersectionList.add(prop);
    }

    /* transform list into the table with one column */
    StringBuffer toReturn = new StringBuffer("");
    for(String prop : intersectionList) {
      toReturn.append(prop).append(CATConstants.NEW_LINE);
    }
    return toReturn.toString();
  }

  /**
   * This method retrieves domain classes for object properties.
   * 
   * @return a table where first column is property uri and the second is a
   *         class uri which is defined to be the domain of the given property.
   *         Note here that duplicate domain classes (created because of way
   *         owlim works) are excluded and only specific ones are returned.
   */
  public static String getPropertyDomain(Ontology ontology)
    throws GateOntologyException {
    String queryAll =
      "SELECT DISTINCT p,y " + " from {p} rdf:type  {<" + OWL.OBJECTPROPERTY
        + ">}," + " {p} rdfs:domain {y} ";

    String queryDomain =
      "select distinct p, y " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:domain {y}, " + "     {p} rdfs:domain {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y != x ";
    return ontology.executeQuery(queryAll + " MINUS " + queryDomain);
  }

  /**
   * This method retrieves range classes for object properties.
   * 
   * @returns a table where first column is property uri and the second is a
   *          class uri which is defined to be the range of the given property.
   *          Note here that duplicate range classes (created because of way
   *          owlim works) are excluded and only specific ones are returned.
   */
  public static String getPropertyRange(Ontology ontology)
    throws GateOntologyException {
    String queryAll =
      "SELECT DISTINCT p,y " + " from {p} rdf:type  {<" + OWL.OBJECTPROPERTY
        + ">}," + " {p} rdfs:range {y} ";

    String queryRange =
      "select distinct p, y " + "from {x} rdfs:subClassOf {y}, "
        + "     {p} rdfs:range {y}, " + "     {p} rdfs:range {x}, "
        + "     {p} rdf:type {<" + OWL.OBJECTPROPERTY + ">} " + "where y != x ";
    return ontology.executeQuery(queryAll + " MINUS " + queryRange);
  }

  /**
   * This method retrieves super classes.
   * 
   * @return a table where first column is a clas uri and the second is the set
   *         of class uris being super class of the first.
   */

  public static String getSuperClasses(Ontology ontology)
    throws GateOntologyException {
    String query = "SELECT DISTINCT x,y " + " from {x} rdfs:subClassOf {y}";
    return ontology.executeQuery(query);
  }

  /**
   * This method retrieves super classes.
   * 
   * 
   * 
   * @return returns a table where first column is a clas uri and the second is
   *         the set of class uris being super class of the first.
   */
  public static String getSubClasses(Ontology ontology)
    throws GateOntologyException {
    String query = "SELECT DISTINCT y,x " + " from {x} rdfs:subClassOf {y}";
    return ontology.executeQuery(query);
  }

  /**
   * This method retrieves properties and their superproperties
   * 
   * @return a table with two columns: propertyURI, propertyURI of the super
   *         property
   */
  public static String getSuperProperties(Ontology ontology)
    throws GateOntologyException {
    String query =
      "Select distinct SUB, SUPER FROM " + " {SUB} rdfs:subPropertyOf {SUPER}"
        + " WHERE SUPER!=SUB " + " MINUS "
        + " select distinct B FROM {B} owl:equivalentProperty {SUB}";
    return ontology.executeQuery(query);
  }


}