Hi Martin,

There's nothing the API IIRC.

The crude way is to write out to byte array and parse it.


Here's my (limited testing) attempt: I chose to work with the Graph API because if you use the Model API there is both up and down casting to match new Statement(Resources, Predicate, RDFNode).

------------------------

public static void main(String... args) {
    Model mSrc = ModelFactory.createDefaultModel();

    RDFDataMgr.read(mSrc, "some-suitable-test-data.nt");

    Model mDst = ModelFactory.createDefaultModel();

    Map<Node,Node> map = new HashMap<>();
    Iter.asStream(mSrc.getGraph().find(Triple.ANY))
        .map(t->clone(map, t))
        .forEach(mDst.getGraph()::add);

    // The N-triples writer uses the internal ID for the label.
    RDFDataMgr.write(System.out, mSrc, Lang.NT);
    System.out.println("----");
    RDFDataMgr.write(System.out, mDst, Lang.NT);
}


public static Triple clone(Map<Node,Node> map, Triple t) {
    return Triple.create(clone(map, t.getSubject()),
                         clone(map, t.getPredicate()),
                         clone(map, t.getObject()));
}

public static Node clone(Map<Node,Node> map, Node n) {
    if ( ! n.isBlank() )
        return n;
    // Just (_)-> in Java9
    return map.computeIfAbsent(n, NodeFactory::createBlankNode);
}



On 02/06/17 17:14, Martin G. Skjæveland wrote:
Hi,

I would like a method Model clone (Model) that creates a copy of a model such that any blank nodes in the copy are kept apart from the source.

The test case below illustrates the intended use: adding the clone of a model back into the model should increase the size of the model, if the model contains blank nodes.

Is there such a method in the API, or need I invent my own? If so, any suggestion of an optimal way will be greatly appreciated.

I have tried by adding a model into a fresh model. My other suggestions are to iterate over all blank nodes in a model and replace all instances with a fresh node, or to use a SPARQL query CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }.

Thanks!
Martin


import static org.junit.Assert.*;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.vocabulary.OWL;
import org.apache.jena.vocabulary.RDF;
import org.junit.Test;

public class ModelsTest {

   @Test
   public void shouldCloneModel () {

     // create the model:  [] a Thing .
     Model source = ModelFactory.createDefaultModel();
     source.add(ResourceFactory.createResource(), RDF.type, OWL.Thing);

     // OK
     assertEquals(1, source.size());

     // clone
     Model copy = clone(source);

     // OK
     assertEquals(1, copy.size());


     // adding cloned copy back into source
     source.add(copy);

     // Fails with current implementation
     assertEquals(2, source.size());
   }

   public Model clone (Model source) {
     Model copy = ModelFactory.createDefaultModel();
     copy.add(source);
     return copy;
   }
}

Reply via email to