package org.deri.vocidex.extract;
import java.util.Iterator;
import org.deri.vocidex.SPARQLRunner;
import org.deri.vocidex.VocidexDocument;
import org.deri.vocidex.describers.ClassDescriber;
import org.deri.vocidex.describers.DatatypeDescriber;
import org.deri.vocidex.describers.SPARQLDescriber;
import org.deri.vocidex.describers.PropertyDescriber;
import com.hp.hpl.jena.util.iterator.NiceIterator;
/**
* Extracts all vocabulary terms (classes, properties, datatypes)
* from a {@link SPARQLRunner}, describes them using the appropriate
* describers, and packages them as indexable
* {@link VocidexDocument}s.
*
* @author Richard Cyganiak
*/
public class VocabularyTermExtractor implements Extractor {
private final SPARQLRunner source;
private final String prefix;
/**
* @param source Model containing declarations of vocabulary terms
* @param prefix Prefix to be used for creating prefixed names; may be null
*/
public VocabularyTermExtractor(SPARQLRunner source, String prefix) {
this.source = source;
this.prefix = prefix;
}
/**
* Extract only classes
*/
public Iterator<VocidexDocument> classes() {
return createDescriptionIterator("list-classes.sparql", "class", new ClassDescriber(source, prefix));
}
/**
* Extract only properties
*/
public Iterator<VocidexDocument> properties() {
return createDescriptionIterator("list-properties.sparql", "property", new PropertyDescriber(source, prefix));
}
/**
* Extract only data types
*/
public Iterator<VocidexDocument> datatypes() {
return createDescriptionIterator("list-datatypes.sparql", "datatype", new DatatypeDescriber(source, prefix));
}
/**
* Extract all terms (classes, properties, datatypes)
*/
@Override
public Iterator<VocidexDocument> iterator() {
return NiceIterator.andThen(classes(), properties()).andThen(datatypes());
}
private Iterator<VocidexDocument> createDescriptionIterator(
String sparqlFileName, String sparqlResultVariable, SPARQLDescriber describer) {
return new DescriberIterator(
source.getURIs(sparqlFileName, null, null, sparqlResultVariable),
describer);
}
}