Skip to content

Instantly share code, notes, and snippets.

@shellac
Created November 2, 2010 11:21
Show Gist options
  • Save shellac/659498 to your computer and use it in GitHub Desktop.
Save shellac/659498 to your computer and use it in GitHub Desktop.
# Add this to your assembler file. prefix will be present
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
[] ja:loadClass "org.ilrt.researchrevealed.describehandler.BackwardForwardDescribeFactory" .
package org.ilrt.researchrevealed.describehandler;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.sparql.ARQConstants;
import com.hp.hpl.jena.sparql.core.Quad;
import com.hp.hpl.jena.sparql.core.describe.DescribeHandler;
import com.hp.hpl.jena.sparql.core.describe.DescribeHandlerFactory;
import com.hp.hpl.jena.sparql.core.describe.DescribeHandlerRegistry;
import com.hp.hpl.jena.sparql.util.Context;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.RDFS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Damian Steer <[email protected]>
*/
public class BackwardForwardDescribeFactory implements DescribeHandlerFactory {
final static Logger log = LoggerFactory.getLogger(BackwardForwardDescribeFactory.class);
static {
log.info("Attaching replacement describe handler");
DescribeHandlerRegistry reg = DescribeHandlerRegistry.get();
log.info("Clearing existing describe handlers");
reg.clear();
reg.add(new BackwardForwardDescribeFactory());
log.info("Attached");
}
@Override
public DescribeHandler create() {
return new BackwardForwardDescribe();
}
public static class BackwardForwardDescribe implements DescribeHandler {
private Dataset dataset;
private Model result;
private Model defaultModel;
private Model unionModel;
@Override
public void start(Model accumulateResultModel, Context qContext) {
this.result = accumulateResultModel;
this.dataset = (Dataset) qContext.get(ARQConstants.sysCurrentDataset);
this.defaultModel = dataset.getDefaultModel();
this.unionModel = dataset.getNamedModel(Quad.unionGraph.getURI());
}
@Override
public void describe(Resource resource) {
result.add(defaultModel.listStatements(resource, null, (RDFNode) null));
result.add(defaultModel.listStatements(null, null, resource));
result.add(unionModel.listStatements(resource, null, (RDFNode) null));
result.add(unionModel.listStatements(null, null, resource));
// Gather labels for dangling refs
Model labels = ModelFactory.createDefaultModel();
ExtendedIterator<RDFNode> it = result.listObjects().andThen(result.listSubjects());
while (it.hasNext()) {
RDFNode node = it.next();
if (node.isLiteral() || resource.equals(node)) continue;
labels.add(defaultModel.listStatements((Resource) node, RDFS.label, (RDFNode) null));
labels.add(unionModel.listStatements((Resource) node, RDFS.label, (RDFNode) null));
}
result.add(labels);
}
@Override
public void finish() {
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment