From 725250ca7afab6cd4e1ecd9b1e1a2e4f19bcaf9f Mon Sep 17 00:00:00 2001 From: Tom Saleeba Date: Thu, 21 Dec 2017 11:41:48 +1030 Subject: [PATCH 1/2] test: add test to confirm bug with cache misses - when the 'object' of a statement misses, it incorrectly looks up the subject --- .gitignore | 3 ++ src/test/java/semantics/RDFImportTest.java | 36 ++++++++++++++++++- .../resources/myrdf/testImportTurtle02.ttl | 14 ++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/myrdf/testImportTurtle02.ttl diff --git a/.gitignore b/.gitignore index dba1d200..36a2bab3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties *.iml +.classpath +.project +.settings/ diff --git a/src/test/java/semantics/RDFImportTest.java b/src/test/java/semantics/RDFImportTest.java index c1d68611..f47d323c 100644 --- a/src/test/java/semantics/RDFImportTest.java +++ b/src/test/java/semantics/RDFImportTest.java @@ -9,6 +9,8 @@ import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.test.TestGraphDatabaseFactory; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -103,7 +105,7 @@ public void testImportJSONLDShortening() throws Exception { db.execute("MATCH (n) WHERE exists(n.ns0_modified) RETURN count(n) AS count") .next().get("count")); - HashMap expectedNamespaceDefs = new HashMap(); + HashMap expectedNamespaceDefs = new HashMap<>(); expectedNamespaceDefs.put("baseName", "http://xmlns.com/foaf/0.1/"); expectedNamespaceDefs.put("prefix", "ns0"); assertEquals(expectedNamespaceDefs, @@ -322,6 +324,30 @@ public void testImportTurtle() throws Exception { assertEquals("http://www.opentox.org/example/1.1#phenol", compounds.next().get("compound")); } + + /** + * Can we populate the cache correctly when we have a miss? + */ + @Test + public void testImportTurtle02() throws Exception { + GraphDatabaseService db = new TestGraphDatabaseFactory().newImpermanentDatabase(); + ((GraphDatabaseAPI)db).getDependencyResolver().resolveDependency(Procedures.class).registerProcedure(RDFImport.class); + + createIndices(db); + db.execute("CREATE (rdf:NamespacePrefixDefinition {" + + " `http://www.example.com/ontology/1.0.0#`: 'ex'," + + " `http://www.w3.org/1999/02/22-rdf-syntax-ns#`: 'rdfs'})"); + Result importResults = db.execute(String.format( + "CALL semantics.importRDF('%s','Turtle',{nodeCacheSize: 1})", file("myrdf/testImportTurtle02.ttl"))); + assertEquals(5L, importResults.next().get("triplesLoaded")); + + Result result = db.execute( + "MATCH (:ex_DISTANCEVALUE)-[:ex_units]->(mu) " + + "RETURN mu.uri AS unitsUri, mu.ex_name as unitsName"); + Map first = result.next(); + assertEquals("http://www.example.com/ontology/1.0.0/common#MEASUREMENTUNIT-T1510615421640", first.get("unitsUri")); + assertEquals("metres", first.get("unitsName")); + } @Test public void testPreviewFromSnippet() throws Exception { @@ -397,4 +423,12 @@ private void createIndices(GraphDatabaseService db) { db.execute("CREATE INDEX ON :Resource(uri)"); } + private static URI file(String path) { + try { + return RDFImportTest.class.getClassLoader().getResource(path).toURI(); + } catch (URISyntaxException e) { + String msg = String.format("Failed to load the resource with path '%s'", path); + throw new RuntimeException(msg, e); + } + } } diff --git a/src/test/resources/myrdf/testImportTurtle02.ttl b/src/test/resources/myrdf/testImportTurtle02.ttl new file mode 100644 index 00000000..456b022f --- /dev/null +++ b/src/test/resources/myrdf/testImportTurtle02.ttl @@ -0,0 +1,14 @@ +@prefix : . +@prefix common: . +@prefix xsd: . +@prefix rdf: . +@prefix project: . + +project:DISTANCEVALUE-A181457 + a :DISTANCEVALUE ; + :units common:MEASUREMENTUNIT-T1510615421640 ; + :value 0.55 . + +common:MEASUREMENTUNIT-T1510615421640 + a :MEASUREMENTUNIT ; + :name "metres" . From a5f67ab8672714f4a06726d8533b5213c303a6a9 Mon Sep 17 00:00:00 2001 From: Tom Saleeba Date: Thu, 21 Dec 2017 11:45:05 +1030 Subject: [PATCH 2/2] fix: fix bug with cache miss lookup for 'object' part of statement --- src/main/java/semantics/DirectStatementLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/semantics/DirectStatementLoader.java b/src/main/java/semantics/DirectStatementLoader.java index 171d88f8..150965c1 100644 --- a/src/main/java/semantics/DirectStatementLoader.java +++ b/src/main/java/semantics/DirectStatementLoader.java @@ -262,7 +262,7 @@ public Node call() { //throws AnyException final Node toNode = nodeCache.get(st.getObject().stringValue(), new Callable() { @Override public Node call() { //throws AnyException - return graphdb.findNode(RESOURCE, "uri", st.getSubject().stringValue()); + return graphdb.findNode(RESOURCE, "uri", st.getObject().stringValue()); } });