diff --git a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParserTest.java b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParserTest.java
index 88bf5cc..d89f0e4 100644
--- a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParserTest.java
+++ b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParserTest.java
@@ -118,33 +118,35 @@
 
     @Test
     public void parseFile() throws Exception {
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(testNt).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        // FIXME: this could potentially break if the equivalent of /tmp
-        // includes
-        // international characters
-        assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
-        // Should be set to the file path - after following symlinks
-        assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(testNt).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            // FIXME: this could potentially break if the equivalent of /tmp
+            // includes
+            // international characters
+            assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
+            // Should be set to the file path - after following symlinks
+            assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
 
-        // Should NOT have guessed the content type
-        assertNull(firstPredicate(g, "contentType"));
-        assertNull(firstPredicate(g, "contentTypeSyntax"));
+            // Should NOT have guessed the content type
+            assertNull(firstPredicate(g, "contentType"));
+            assertNull(firstPredicate(g, "contentTypeSyntax"));
+        }
     }
 
     @Test
     public void parseFileSymlink() throws Exception {
-    	// This test will typically not work in Windows
-    	// which requires system privileges to create symlinks
-    	assumeNotNull(symlink);
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(symlink).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        assertEquals("<" + symlink.toUri().toString() + ">", firstPredicate(g, "source"));
-        assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
+        // This test will typically not work in Windows
+        // which requires system privileges to create symlinks
+        assumeNotNull(symlink);
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(symlink).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            assertEquals("<" + symlink.toUri().toString() + ">", firstPredicate(g, "source"));
+            assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
+        }
     }
 
     @Test
@@ -176,19 +178,19 @@
 
     @Test
     public void parseFileContentType() throws Exception {
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(testNt).contentType(RDFSyntax.NTRIPLES).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        // FIXME: this could potentially break if the equivalent of /tmp
-        // includes
-        // international characters
-        assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
-        // Should be set to the file path - after following symlinks
-        assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
-        assertEquals("\"" + RDFSyntax.NTRIPLES.name() + "\"",
-                firstPredicate(g, "contentTypeSyntax"));
-        assertEquals("\"application/n-triples\"", firstPredicate(g, "contentType"));
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(testNt).contentType(RDFSyntax.NTRIPLES).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            // FIXME: this could potentially break if the equivalent of /tmp
+            // includes
+            // international characters
+            assertEquals("<" + testNt.toUri().toString() + ">", firstPredicate(g, "source"));
+            // Should be set to the file path - after following symlinks
+            assertEquals("<" + testNt.toRealPath().toUri().toString() + ">", firstPredicate(g, "base"));
+            assertEquals("\"" + RDFSyntax.NTRIPLES.name() + "\"", firstPredicate(g, "contentTypeSyntax"));
+            assertEquals("\"application/n-triples\"", firstPredicate(g, "contentType"));
+        }
     }
 
     private String firstPredicate(final Graph g, final String pred) {
@@ -214,64 +216,65 @@
     public void parseInputStreamWithBase() throws Exception {
         final InputStream inputStream = new ByteArrayInputStream(new byte[0]);
         final IRI base = dummyParser.createRDFTermFactory().createIRI("http://www.example.org/test.rdf");
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(inputStream).base(base).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        assertEquals("<http://www.example.org/test.rdf>", firstPredicate(g, "base"));
-        // in our particular debug output,
-        // bnode source indicates InputStream
-        assertTrue(firstPredicate(g, "source").startsWith("_:"));
-        assertNull(firstPredicate(g, "contentType"));
-        assertNull(firstPredicate(g, "contentTypeSyntax"));
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(inputStream).base(base).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            assertEquals("<http://www.example.org/test.rdf>", firstPredicate(g, "base"));
+            // in our particular debug output,
+            // bnode source indicates InputStream
+            assertTrue(firstPredicate(g, "source").startsWith("_:"));
+            assertNull(firstPredicate(g, "contentType"));
+            assertNull(firstPredicate(g, "contentTypeSyntax"));
+        }
     }
 
     @Test
     public void parseInputStreamWithNQuads() throws Exception {
         final InputStream inputStream = new ByteArrayInputStream(new byte[0]);
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(inputStream).contentType(RDFSyntax.NQUADS).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        assertNull(firstPredicate(g, "base"));
-        // in our particular debug output,
-        // bnode source indicates InputStream
-        assertTrue(firstPredicate(g, "source").startsWith("_:"));
-        assertEquals("\"application/n-quads\"", firstPredicate(g, "contentType"));
-        assertEquals("\"" + RDFSyntax.NQUADS.name() + "\"",
-                firstPredicate(g, "contentTypeSyntax"));
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(inputStream).contentType(RDFSyntax.NQUADS).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            assertNull(firstPredicate(g, "base"));
+            // in our particular debug output,
+            // bnode source indicates InputStream
+            assertTrue(firstPredicate(g, "source").startsWith("_:"));
+            assertEquals("\"application/n-quads\"", firstPredicate(g, "contentType"));
+            assertEquals("\"" + RDFSyntax.NQUADS.name() + "\"", firstPredicate(g, "contentTypeSyntax"));
+        }
     }
 
     @Test
     public void parseIRI() throws Exception {
         final IRI iri = dummyParser.createRDFTermFactory().createIRI("http://www.example.net/test.ttl");
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(iri).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
-        // No base - assuming the above IRI is always
-        // the base would break server-supplied base from
-        // any HTTP Location redirects and Content-Location header
-        assertNull(firstPredicate(g, "base"));
-        // ".ttl" in IRI string does not imply any content type
-        assertNull(firstPredicate(g, "contentType"));
-        assertNull(firstPredicate(g, "contentTypeSyntax"));
-
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(iri).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
+            // No base - assuming the above IRI is always
+            // the base would break server-supplied base from
+            // any HTTP Location redirects and Content-Location header
+            assertNull(firstPredicate(g, "base"));
+            // ".ttl" in IRI string does not imply any content type
+            assertNull(firstPredicate(g, "contentType"));
+            assertNull(firstPredicate(g, "contentTypeSyntax"));
+        }
     }
 
     @Test
     public void parseIRIBaseContentType() throws Exception {
         final IRI iri = dummyParser.createRDFTermFactory().createIRI("http://www.example.net/test.ttl");
-        final Graph g = factory.createGraph();
-        final RDFParser parser = dummyParser.source(iri).base(iri).contentType(RDFSyntax.TURTLE).target(g);
-        parser.parse().get(5, TimeUnit.SECONDS);
-        checkGraph(g);
-        assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
-        assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "base"));
-        assertEquals("\"" + RDFSyntax.TURTLE.name() + "\"",
-                firstPredicate(g, "contentTypeSyntax"));
-        assertEquals("\"text/turtle\"", firstPredicate(g, "contentType"));
+        try (final Graph g = factory.createGraph()) {
+            final RDFParser parser = dummyParser.source(iri).base(iri).contentType(RDFSyntax.TURTLE).target(g);
+            parser.parse().get(5, TimeUnit.SECONDS);
+            checkGraph(g);
+            assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "source"));
+            assertEquals("<http://www.example.net/test.ttl>", firstPredicate(g, "base"));
+            assertEquals("\"" + RDFSyntax.TURTLE.name() + "\"", firstPredicate(g, "contentTypeSyntax"));
+            assertEquals("\"text/turtle\"", firstPredicate(g, "contentType"));
+        }
     }
 
 }
