package tr.com.srdc.mdr.core.store.query;
import java.util.ArrayList;
import java.util.List;
import tr.com.srdc.mdr.core.api.ai.Context;
import tr.com.srdc.mdr.core.api.ai.DataElementConcept;
import tr.com.srdc.mdr.core.api.ai.ObjectClass;
import tr.com.srdc.mdr.core.api.composite.Datatype;
import tr.com.srdc.mdr.core.impl.ai.ClassificationSchemeImpl;
import tr.com.srdc.mdr.core.impl.ai.ConceptImpl;
import tr.com.srdc.mdr.core.impl.ai.ContextImpl;
import tr.com.srdc.mdr.core.impl.ai.DataElementConceptImpl;
import tr.com.srdc.mdr.core.impl.ai.DataElementImpl;
import tr.com.srdc.mdr.core.impl.ai.EnumeratedConceptualDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.EnumeratedValueDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.NonEnumeratedConceptualDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.NonEnumeratedValueDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.PropertyImpl;
import tr.com.srdc.mdr.core.impl.composite.ContactImpl;
import tr.com.srdc.mdr.core.impl.composite.DatatypeImpl;
import tr.com.srdc.mdr.core.impl.composite.OrganizationImpl;
import tr.com.srdc.mdr.core.impl.composite.ValueMeaningImpl;
import tr.com.srdc.mdr.core.model.Abbreviation;
import tr.com.srdc.mdr.core.model.iso11179.ClassificationSchemeResource;
import tr.com.srdc.mdr.core.model.iso11179.ConceptResource;
import tr.com.srdc.mdr.core.model.iso11179.ConceptualDomainResource;
import tr.com.srdc.mdr.core.model.iso11179.ContextResource;
import tr.com.srdc.mdr.core.model.iso11179.DataElementConceptResource;
import tr.com.srdc.mdr.core.model.iso11179.DataElementResource;
import tr.com.srdc.mdr.core.model.iso11179.ObjectClassResource;
import tr.com.srdc.mdr.core.model.iso11179.PropertyResource;
import tr.com.srdc.mdr.core.model.iso11179.ValueDomainResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ContactResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.DatatypeResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.OrganizationResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ValueMeaningResource;
import tr.com.srdc.mdr.core.store.MDRDatabase;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.vocabulary.XSD;
public abstract class ResourceQueryFactory {
public static enum TextSearchType {
Exact, AllWords, WildCard
}
protected final static String PREFIX_RDFS = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> ";
protected final static String PREFIX_RDF = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ";
protected final static String PREFIX_OWL = "PREFIX owl: <http://www.w3.org/2002/07/owl#> ";
protected final static String PREFIX_XSD = "PREFIX xsd: <" + XSD.getURI()
+ "> ";
// TODO : This prefix URI should be retrieved from mdrDatabase.getBaseURI()
protected final static String PREFIX_MDR = "PREFIX mdr: <"
+ MDRDatabase.BASE_URI + "> ";
protected final MDRDatabase mdrDatabase;
public ResourceQueryFactory(MDRDatabase mdrDatabase) {
this.mdrDatabase = mdrDatabase;
}
abstract protected QueryExecution createQueryExecution(String queryString,
OntModel ontModel);
/**
* Calculates the number of results after a full text search
*
* @param searchKeyword
* search keyword to be matched
* @param contextURI
* Optional. URI of the context.
* @param searchType
* Optional. if given <code>null</code>, search is done over all @Context
* s.
* @return
*/
abstract public int getNumberOfDataElementSearch(String searchKeyword,
String contextURI, TextSearchType searchType);
/**
* Executes a full text search over the database to find matching properties
*
* @param searchKeyword
* search keyword to be matched
* @param contextURI
* Optional. URI of the context.
* @param searchType
* Optional. if given <code>null</code>, search is done over all @Context
* s.
* @param limit
* Number of results to be displated
* @param offset
* Starting indice of displayed results
* @return
*/
abstract public List<? super DataElementResource> searchDataElement(
String searchKeyword, String contextURI, TextSearchType searchType,
int limit, int offset);
abstract public List<? super PropertyResource> searchProperty(
String keyword, String contextURI, TextSearchType searchType);
/**
* SHOULD NOT BE DIRECTLY CALLED BY TH USER, USE REPOSITORY METHODS Executes
* a keyword search on the MDRDatabase to find ConceptualDomain over a given
* Context
*
* @param keyword
* Keyword to be matched with Designation of Conceptual Domain on
* given Context
* @param contextURI
* Optional. URI of the context.
* @param searchType
* @return
*/
abstract public List<? super ConceptualDomainResource> searchConceptualDomain(
String keyword, String contextURI, TextSearchType searchType);
abstract public List<? super ValueDomainResource> searchValueDomain(
String keyword, String uri, TextSearchType textSearchType);
public List<? super ClassificationSchemeResource> getClassificationSchemes(
String contextURI) {
List<ClassificationSchemeResource> csList = new ArrayList<ClassificationSchemeResource>();
ResultSet rs = getClassificationSchemesOfContext(contextURI);
while (rs.hasNext()) {
QuerySolution qs = rs.next();
Resource res = qs.getResource("cs");
csList.add(new ClassificationSchemeImpl(res, mdrDatabase));
}
return csList;
}
/**
* Method to execute full text search on the MDR to match given string with
* the Datatype Names
*
* @param datatypeName
* Name of the Datatype which is looked for
* @param searchType
* Enumeration for types of Full Text Search
* @return
*/
public List<? super DatatypeResource> searchDatatype(String datatypeName) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append(PREFIX_XSD)
.append("SELECT ?datatype FROM <").append(MDRDatabase.BASE_URI)
.append("> WHERE {")
.append("?datatype rdfs:subClassOf mdr:Datatype. ")
.append("?datatype mdr:datatypeName \"").append(datatypeName)
.append("\"^^xsd:string }");
List<DatatypeResource> datatypeList = new ArrayList<DatatypeResource>();
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
// here conceptualDomain is checked whether its enumerated or
// not, proper instantiation is done
Resource res = qs.getResource("datatype");
datatypeList.add(new DatatypeImpl(res, mdrDatabase));
}
} finally {
qexec.close();
}
return datatypeList;
}
public ContactResource getContactResource(String contactName) {
return new ContactImpl(mdrDatabase.getOntModel().getResource(
mdrDatabase.getResourceFactory().makeID(
Abbreviation.Contact.toString(), contactName)),
mdrDatabase);
}
public OrganizationResource getOrganizationResource(String organizationName) {
return new OrganizationImpl(mdrDatabase.getOntModel()
.getResource(
mdrDatabase.getResourceFactory().makeID(
Abbreviation.Organization.toString(),
organizationName)), mdrDatabase);
}
public ContextResource getContextResource(String uniqueID) {
return new ContextImpl(mdrDatabase.getOntModel().getResource(
mdrDatabase.getResourceFactory().makeID(
Abbreviation.Context.toString(), uniqueID)),
mdrDatabase);
}
public Resource getAdministeredItem(String id) {
StringBuilder queryString = new StringBuilder()
.append(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT ?ai FROM <")
.append(MDRDatabase.BASE_URI)
.append("> WHERE { ")
.append("?prop rdfs:subPropertyOf mdr:administeredItemAdministrationRecord. ")
.append("?ai ?prop ?administrationRecord. ")
.append("?administrationRecord mdr:administeredItemIdentifier ?ii.")
.append("?ii mdr:dataIdentifier ?di. FILTER regex (?di, \"")
.append(id).append("\") .}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
Resource ai = null;
try {
ResultSet rs = qexec.execSelect();
if (rs.hasNext()) {
QuerySolution qs = rs.next();
ai = qs.getResource("ai");
}
if (rs.hasNext()) {
throw new IllegalStateException(
"Something is wrong. There is more than one AdministeredItems with the same ID.");
}
} finally {
qexec.close();
}
return ai;
}
public Resource getAdministeredItem(String id,
String registrationAuthorityOrganizationID, String version) {
StringBuilder queryString = new StringBuilder()
.append(PREFIX_MDR)
.append(PREFIX_RDFS)
.append(PREFIX_XSD)
.append("SELECT ?ai FROM <")
.append(MDRDatabase.BASE_URI)
.append("> WHERE { ")
.append("?prop rdfs:subPropertyOf mdr:administeredItemAdministrationRecord. ")
.append("?ai ?prop ?administrationRecord. ")
.append("?administrationRecord mdr:administeredItemIdentifier ?ii. ")
.append("?ii mdr:dataIdentifier \"").append(id)
.append("\"^^xsd:string. ")
.append("?ii mdr:itemRegistrationAuthorityIdentifier ?rai. ")
.append("?rai mdr:organizationIdentifier \"")
.append(registrationAuthorityOrganizationID)
.append("\"^^xsd:string. ");
if (version != null && !version.isEmpty()) {
queryString.append("?ii mdr:version \"").append(version)
.append("\"^^xsd:string. ");
;
}
queryString.append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
Resource ai = null;
try {
ResultSet rs = qexec.execSelect();
if (rs.hasNext()) {
QuerySolution qs = rs.next();
ai = qs.getResource("ai");
}
if (rs.hasNext()) {
throw new IllegalStateException(
"Something is wrong. There is more than one AdministeredItems with the same ID and RegistrationAuthorityIdentifier.organizationIdentifier.");
}
} finally {
qexec.close();
}
return ai;
}
public List<? super ContextResource> getContextsOfContext(String contextURI) {
List<ContextResource> contextResourceList = new ArrayList<ContextResource>();
StringBuilder queryString = new StringBuilder().append(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?ctx FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?ctx rdfs:subClassOf mdr:Context .")
.append("?ctx mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("FILTER (?ctx != <")
.append(contextURI).append("> ) }");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
ContextResource ctx = new ContextImpl(qs.getResource("ctx"),
this.mdrDatabase);
contextResourceList.add(ctx);
}
} finally {
qexec.close();
}
return contextResourceList;
}
public List<? super DataElementResource> getDataElementsOfContext(
String contextURI, Integer limit, Integer offset) {
List<DataElementResource> dataElementResourceList = new ArrayList<DataElementResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?de FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?de rdfs:subClassOf mdr:DataElement .")
.append("?de mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("}");
if (limit != null && offset != null) {
queryString.append(" ORDER BY ?de ").append(" LIMIT ")
.append(limit).append(" OFFSET ").append(offset);
}
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
DataElementResource ctx = new DataElementImpl(
qs.getResource("de"), this.mdrDatabase);
dataElementResourceList.add(ctx);
}
} finally {
qexec.close();
}
return dataElementResourceList;
}
/**
* @param uri
* URI of the Context
* @return total number of Data Element's on specified Context
*/
public int getNumberOfDataElementsOfContext(String uri) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT (COUNT(DISTINCT ?de) as ?count) FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?de rdfs:subClassOf mdr:DataElement .")
.append("?de mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(uri).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
int size = 0;
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
size = qs.getLiteral("count").getInt();
}
} finally {
qexec.close();
}
return size;
}
/**
*
* @param contextURI
* @param limit
* @param offset
* @return
*/
public List<? super ConceptualDomainResource> getConceptualDomainsOfContext(
String contextURI, Integer limit, Integer offset) {
List<ConceptualDomainResource> cdList = new ArrayList<ConceptualDomainResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?cd FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?cdClass rdfs:subClassOf mdr:ConceptualDomain .")
.append("?cd rdfs:subClassOf ?cdClass .")
.append("?cd mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> . }");
if (limit != null && offset != null) {
queryString.append(" LIMIT ").append(limit).append(" OFFSET ")
.append(offset);
}
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
// here conceptualDomain is checked whether its enumerated or
// not, proper instantiation is done
OntClass res = mdrDatabase.getOntModel().getOntClass(
qs.getResource("cd").getURI());
if (res.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedConceptualDomain)) {
cdList.add(new EnumeratedConceptualDomainImpl(res,
mdrDatabase));
} else {
cdList.add(new NonEnumeratedConceptualDomainImpl(res,
mdrDatabase));
}
}
} finally {
qexec.close();
}
return cdList;
}
public List<? super PropertyResource> getPropertiesOfContext(
String contextURI) {
List<PropertyResource> propertyList = new ArrayList<PropertyResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?property FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?property rdfs:subClassOf mdr:Property .")
.append("?property mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
PropertyResource prop = new PropertyImpl(
qs.getResource("property"), mdrDatabase);
propertyList.add(prop);
}
} finally {
qexec.close();
}
return propertyList;
}
/**
* Runs SPARQL Query ove the MDRDatabase to get list of {@link ObjectClass}
* es on a specific {@link Context}
*
* @param contextURI
* URI of the Context on MDRDatabase
* @return List of {@link ObjectClassResource} on the specified Context
*/
public List<? super ObjectClassResource> getObjectClassesOfContext(
String contextURI, Integer limit, Integer offset) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?objectClass FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?objectClassClass rdfs:subClassOf mdr:ObjectClass .")
.append("?objectClass rdfs:subClassOf ?objectClassClass .")
.append("?objectClass mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> . }");
if (limit != null && offset != null) {
queryString.append(" LIMIT ").append(limit).append(" OFFSET ")
.append(offset);
}
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
List<ObjectClassResource> objectClassResourceList = new ArrayList<ObjectClassResource>();
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
ConceptResource ctx = new ConceptImpl(
qs.getResource("objectClass"), this.mdrDatabase);
objectClassResourceList.add(ctx);
}
} finally {
qexec.close();
}
return objectClassResourceList;
}
/**
* With given objectClassURI, tihs method returns a list of all
* {@link DataElementConcept}s whose {@link ObjectClass} is given
*
* @param objectClassURI
* Unique URI of the ObjectClass
* @return {@link DataElementConcept}s created with given ObjectClass
*/
public List<? super DataElementConceptResource> getDECSofOC(
String objectClassURI, Integer limit, Integer offset) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?dec FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?dec rdfs:subClassOf mdr:DataElementConcept .")
.append("?dec mdr:dataElementConceptObjectClass <")
.append(objectClassURI).append("> .").append("}");
if (limit != null && offset != null) {
queryString.append(" LIMIT ").append(limit).append(" OFFSET ")
.append(offset);
}
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
List<DataElementConceptResource> decResourceList = new ArrayList<DataElementConceptResource>();
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
DataElementConceptResource ctx = new DataElementConceptImpl(
qs.getResource("dec"), this.mdrDatabase);
decResourceList.add(ctx);
}
} finally {
qexec.close();
}
return decResourceList;
}
public ResultSet getRepresentationClassesOfContext(String contextURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?rc FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?rc rdfs:subClassOf mdr:RepresentationClass .")
.append("?rc mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> . }");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
return qexec.execSelect();
}
public ResultSet getDerivationRulesOfContext(String contextURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?dr FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?dr rdfs:subClassOf mdr:DerivationRule .")
.append("?dr mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> . }");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
return qexec.execSelect();
}
public ResultSet getClassificationSchemesOfContext(String contextURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?cs FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?cs rdfs:subClassOf mdr:ClassificationScheme .")
.append("?cs mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> . }");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
return qexec.execSelect();
}
public List<? super ValueDomainResource> getValueDomainsOfConceptualDomain(
String cdURI) {
List<ValueDomainResource> vdList = new ArrayList<ValueDomainResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?vd FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?vdClass rdfs:subClassOf mdr:ValueDomain .")
.append("?vd rdfs:subClassOf ?vdClass . ")
.append("?vd mdr:representingConceptualDomainRepresentation <")
.append(cdURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
// here conceptualDomain is checked whether its enumerated or
// not, proper instantiation is done
OntClass res = mdrDatabase.getOntModel().getOntClass(
qs.getResource("vd").getURI());
if (res.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedValueDomain)) {
vdList.add(new EnumeratedValueDomainImpl(res, mdrDatabase));
} else {
vdList.add(new NonEnumeratedValueDomainImpl(res,
mdrDatabase));
}
}
} finally {
qexec.close();
}
return vdList;
}
public List<? super ValueMeaningResource> listValueMeningsOfCD(
String cdURI, int limit, int offset) {
List<ValueMeaningResource> vmList = new ArrayList<ValueMeaningResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT DISTINCT ?vm FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?vm rdfs:subClassOf mdr:ValueMeaning .")
.append("?vm mdr:valueMeaningIdentifier ?id . ")
.append("?vm mdr:containedInValueMeaningSet <").append(cdURI)
.append("> .").append("} ORDER BY ?id LIMIT ").append(limit)
.append(" OFFSET ").append(offset);
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
// here conceptualDomain is checked whether its enumerated or
// not, proper instantiation is done
OntClass res = mdrDatabase.getOntModel().getOntClass(
qs.getResource("vm").getURI());
if (res.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedValueDomain)) {
vmList.add(new ValueMeaningImpl(res, mdrDatabase));
} else {
vmList.add(new ValueMeaningImpl(res, mdrDatabase));
}
}
} finally {
qexec.close();
}
return vmList;
}
public int getNumberOfValueMeanings(String conceptualDomainURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT (COUNT(DISTINCT ?vm) as ?count) FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?vm rdfs:subClassOf mdr:ValueMeaning .")
.append("?vm mdr:containedInValueMeaningSet <")
.append(conceptualDomainURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
int size = 0;
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
size = qs.getLiteral("count").getInt();
}
} finally {
qexec.close();
}
return size;
}
public int getNumberOfConceptualDomains(String contextURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT (COUNT (DISTINCT ?cd) as ?count) FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?cdClass rdfs:subClassOf mdr:ConceptualDomain .")
.append("?cd rdfs:subClassOf ?cdClass .")
.append("?cd mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
int size = 0;
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
size = qs.getLiteral("count").getInt();
}
} finally {
qexec.close();
}
return size;
}
public int getNumberOfObjectClasses(String contextURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT (COUNT (DISTINCT ?objectClass) as ?count) FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?objectClassClass rdfs:subClassOf mdr:ObjectClass .")
.append("?objectClass rdfs:subClassOf ?objectClassClass .")
.append("?objectClass mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
int size = 0;
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
size = qs.getLiteral("count").getInt();
}
} finally {
qexec.close();
}
return size;
}
public int getNumberOfDEC(String objectClassURI) {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS)
.append("SELECT (COUNT (DISTINCT ?dec) as ?count) FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?dec rdfs:subClassOf mdr:DataElementConcept .")
.append("?dec mdr:dataElementConceptObjectClass <")
.append(objectClassURI).append("> .").append("}");
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
int size = 0;
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
size = qs.getLiteral("count").getInt();
}
} finally {
qexec.close();
}
return size;
}
/**
* @return all of the {@link Datatype}s
*/
public List<? super DatatypeResource> getDatatypes() {
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append(PREFIX_XSD)
.append("SELECT ?datatype FROM <").append(MDRDatabase.BASE_URI)
.append("> WHERE {")
.append("?datatype rdfs:subClassOf mdr:Datatype }");
List<DatatypeResource> datatypeList = new ArrayList<DatatypeResource>();
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
Resource res = qs.getResource("datatype");
datatypeList.add(new DatatypeImpl(res, mdrDatabase));
}
} finally {
qexec.close();
}
return datatypeList;
}
public List<? super ValueDomainResource> getValueDomainsOfContext(
String contextURI, Integer limit, Integer offset) {
List<ValueDomainResource> valueDomainResourceList = new ArrayList<ValueDomainResource>();
StringBuilder queryString = new StringBuilder(PREFIX_MDR)
.append(PREFIX_RDFS).append("SELECT ?vd FROM <")
.append(MDRDatabase.BASE_URI).append("> WHERE {")
.append("?vdClass rdfs:subClassOf mdr:ValueDomain .")
.append("?vd rdfs:subClassOf mdr:vdClass . ")
.append("?vd mdr:having ?aic .")
.append("?aic mdr:administeredItemContextContext <")
.append(contextURI).append("> .").append("}");
if (limit != null && offset != null) {
queryString.append(" ORDER BY ?de ").append(" LIMIT ")
.append(limit).append(" OFFSET ").append(offset);
}
QueryExecution qexec = this.createQueryExecution(
queryString.toString(), this.mdrDatabase.getOntModel());
try {
ResultSet rs = qexec.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
// here conceptualDomain is checked whether its enumerated or
// not, proper instantiation is done
OntClass res = mdrDatabase.getOntModel().getOntClass(
qs.getResource("cd").getURI());
if (res.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedValueDomain)) {
valueDomainResourceList.add(new EnumeratedValueDomainImpl(
res, mdrDatabase));
} else {
valueDomainResourceList
.add(new NonEnumeratedValueDomainImpl(res,
mdrDatabase));
}
}
} finally {
qexec.close();
}
return valueDomainResourceList;
}
}