/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.sparql.core.describe; import org.apache.jena.query.* ; import org.apache.jena.rdf.model.Model ; import org.apache.jena.rdf.model.Resource ; import org.apache.jena.sparql.ARQConstants ; import org.apache.jena.sparql.util.Closure ; import org.apache.jena.sparql.util.Context ; /** DescribeHandler that calculates the bNode closure. * Takes all the statements of this resource, and for every object that is * a bNode, it recursively includes its statements. */ public class DescribeBNodeClosure implements DescribeHandler { Model acc ; Dataset dataset ; public DescribeBNodeClosure() {} @Override public void start(Model accumulateResultModel, Context cxt) { acc = accumulateResultModel ; this.dataset = (Dataset)cxt.get(ARQConstants.sysCurrentDataset) ; } // DISTINCT - we only need each ?g once. private static Query query = QueryFactory.create("SELECT DISTINCT ?g { GRAPH ?g { ?s ?p ?o } }") ; // Check all named graphs @Override public void describe(Resource r) { // Default model. Closure.closure(otherModel(r, dataset.getDefaultModel()), false, acc) ; // Find all the named graphs in which this resource // occurs as a subject. Faster than iterating in the // names of graphs in the case of very large numbers // of graphs, few of which contain the resource, in // some kind of persistent storage. QuerySolutionMap qsm = new QuerySolutionMap() ; qsm.add("s", r) ; QueryExecution qExec = QueryExecutionFactory.create(query, dataset, qsm) ; ResultSet rs = qExec.execSelect() ; for ( ; rs.hasNext() ; ) { QuerySolution qs = rs.next() ; String gName = qs.getResource("g").getURI() ; Model model = dataset.getNamedModel(gName) ; Resource r2 = otherModel(r, model) ; Closure.closure(r2, false, acc) ; } // // Named graphs // for ( Iterator<String> iter = dataset.listNames() ; iter.hasNext() ; ) // { // String name = iter.next(); // Model model = dataset.getNamedModel(name) ; // Resource r2 = otherModel(r, model) ; // Closure.closure(r2, false, acc) ; // } Closure.closure(r, false, acc) ; } private static Resource otherModel(Resource r, Model model) { if ( r.isURIResource() ) return model.createResource(r.getURI()) ; if ( r.isAnon() ) return model.createResource(r.getId()) ; // Literals do not need converting. return r ; } @Override public void finish() { } }