package won.cryptography.utils; import org.apache.jena.query.Dataset; import org.apache.jena.query.DatasetFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.ResIterator; import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.riot.RDFFormat; import org.junit.Assert; import org.junit.Test; import java.io.*; /** * User: ypanchenko * Date: 15.07.2014 */ public class JenaBnodeInDatasetTest { private static final String RESOURCE_FILE = "/test_2graphs.trig"; @Test public void testReadWriteDatasetWithTwoGraphs() throws Exception { InputStream is = this.getClass().getResourceAsStream(RESOURCE_FILE); Dataset dataset = DatasetFactory.createGeneral(); RDFDataMgr.read(dataset, is, RDFFormat.TRIG.getLang()); is.close(); assertSameSubjBnode(dataset, "http://www.example.com#", "G1", "G2", "pred1", "pred2"); File outFile = File.createTempFile("won", ".trig"); System.out.println(outFile); OutputStream os = new FileOutputStream(outFile); // Writing in TRIG results in loosing info about shared between graphs blank node. // I wrote to Jena mailing list and they opened https://issues.apache.org/jira/browse/JENA-745 // Solution for the moment is to use TRIG_BLOCKS when writing //RDFDataMgr.write(os, dataset, RDFFormat.TRIG); RDFDataMgr.write(os, dataset, RDFFormat.TRIG_BLOCKS); os.close(); InputStream is2 = new FileInputStream(outFile);; Dataset dataset2 = DatasetFactory.createGeneral(); RDFDataMgr.read(dataset2, is2, RDFFormat.TRIG.getLang()); is2.close(); assertSameSubjBnode(dataset2, "http://www.example.com#", "G1", "G2", "pred1", "pred2"); } private void assertSameSubjBnode(Dataset dataset, final String ns, final String g1, final String g2, final String pred1, final String pred2) { Model model1 = dataset.getNamedModel(ns + g1); Model model2 = dataset.getNamedModel(ns + g2); Property prop1 = model1.createProperty(ns, pred1); ResIterator iter1 = model1.listResourcesWithProperty(prop1, null); Property prop2 = model2.createProperty(ns, pred2); ResIterator iter2 = model2.listResourcesWithProperty(prop2, null); Resource r1 = iter1.next(); Resource r2 = iter2.next(); Assert.assertTrue(r1 != null && r1.equals(r2)); } }