package com.tinkerpop.blueprints.impls.sail; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.TestSuite; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.impls.GraphTest; import org.openrdf.model.impl.LiteralImpl; import org.openrdf.model.impl.URIImpl; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.regex.Matcher; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class SailGraphSpecificTestSuite extends TestSuite { public SailGraphSpecificTestSuite() { } public SailGraphSpecificTestSuite(final GraphTest graphTest) { super(graphTest); } public void testTypeConversion() { assertEquals(SailVertex.castLiteral(new LiteralImpl("marko", new URIImpl("http://www.w3.org/2001/XMLSchema#string"))).getClass(), String.class); assertEquals(SailVertex.castLiteral(new LiteralImpl("marko")).getClass(), String.class); assertEquals(SailVertex.castLiteral(new LiteralImpl("27", new URIImpl("http://www.w3.org/2001/XMLSchema#int"))).getClass(), Integer.class); assertEquals(SailVertex.castLiteral(new LiteralImpl("27", new URIImpl("http://www.w3.org/2001/XMLSchema#float"))).getClass(), Float.class); assertEquals(SailVertex.castLiteral(new LiteralImpl("27.0134", new URIImpl("http://www.w3.org/2001/XMLSchema#double"))).getClass(), Double.class); assertEquals(SailVertex.castLiteral(new LiteralImpl("hello", "en")), "hello"); } public void testNamespaceConversion() throws Exception { SailGraph graph = (SailGraph) graphTest.generateGraph(); graph.addNamespace("tg", "http://tinkerpop.com#"); graph.addNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); assertEquals(graph.expandPrefix("tg:name"), "http://tinkerpop.com#name"); assertEquals(graph.expandPrefix("rdf:label"), "http://www.w3.org/1999/02/22-rdf-syntax-ns#label"); assertEquals(graph.prefixNamespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#label"), "rdf:label"); assertEquals(graph.prefixNamespace("http://tinkerpop.com#name"), "tg:name"); graph.shutdown(); } public void testURIs() { assertFalse(SailHelper.isURI("_:1234")); assertFalse(SailHelper.isURI("_:abcdefghijklmnopqrstuvwxyz")); assertTrue(SailHelper.isURI("http://marko")); assertTrue(SailHelper.isURI("http://www.w3.org/2001/XMLSchema#string")); } public void testBNodes() { assertTrue(SailHelper.isBNode("_:1234")); assertTrue(SailHelper.isBNode("_:abcdefghijklmnopqrstuvwxyz")); assertFalse(SailHelper.isBNode("_:")); assertFalse(SailHelper.isBNode("http://marko")); assertFalse(SailHelper.isBNode("http://www.w3.org/2001/XMLSchema#string")); } public void testLiterals() { assertTrue(SailHelper.isLiteral("\"java\"^^<http://www.w3.org/2001/XMLSchema#string>")); assertFalse(SailHelper.isLiteral("http://www.w3.org/2001/XMLSchema#string")); assertFalse(SailHelper.isLiteral("^^<http://www.w3.org/2001/XMLSchema#string>")); assertTrue(SailHelper.isLiteral("\"\"^^<http://www.w3.org/2001/XMLSchema#string>")); assertTrue(SailHelper.isLiteral("\"\"")); assertTrue(SailHelper.isLiteral("\"marko\"")); assertFalse(SailHelper.isLiteral("\"marko\"marko")); assertFalse(SailHelper.isLiteral("\"")); // TODO: make this true assertFalse(SesameGraph.isLiteral("\"marko\"marko\"")); Matcher matcher = SailHelper.literalPattern.matcher("\"java\"^^<http://www.w3.org/2001/XMLSchema#string>"); matcher.matches(); assertNull(matcher.group(6)); assertEquals(matcher.group(1), "java"); assertEquals(matcher.group(4), "http://www.w3.org/2001/XMLSchema#string"); matcher = SailHelper.literalPattern.matcher("\"java\"@en"); matcher.matches(); assertNull(matcher.group(4)); assertEquals(matcher.group(1), "java"); assertEquals(matcher.group(6), "en"); } public void testLiteralProperties() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Vertex v = graph.getVertex("\"java\"^^<http://www.w3.org/2001/XMLSchema#string>"); assertEquals(v.getProperty(SailTokens.VALUE), "java"); assertEquals(v.getProperty(SailTokens.DATATYPE), "http://www.w3.org/2001/XMLSchema#string"); assertNull(v.getProperty(SailTokens.LANGUAGE)); assertEquals(v.getProperty(SailTokens.KIND), "literal"); v = graph.getVertex("\"10\"^^<http://www.w3.org/2001/XMLSchema#int>"); assertEquals(v.getProperty(SailTokens.VALUE), 10); assertEquals(v.getProperty(SailTokens.DATATYPE), "http://www.w3.org/2001/XMLSchema#int"); assertNull(v.getProperty(SailTokens.LANGUAGE)); assertEquals(v.getProperty(SailTokens.KIND), "literal"); v = graph.getVertex("\"goodbye\"@en"); assertEquals(v.getProperty(SailTokens.VALUE), "goodbye"); assertEquals(v.getProperty(SailTokens.LANGUAGE), "en"); assertNull(v.getProperty(SailTokens.DATATYPE)); assertEquals(v.getProperty(SailTokens.KIND), "literal"); } public void testValueKinds() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Vertex v = graph.getVertex("\"java\"^^<http://www.w3.org/2001/XMLSchema#string>"); assertEquals(v.getProperty(SailTokens.KIND), "literal"); v = graph.getVertex("http://markorodriguez.com"); assertEquals(v.getProperty(SailTokens.KIND), "uri"); v = graph.getVertex("_:123"); assertEquals(v.getProperty(SailTokens.KIND), "bnode"); } public void testSparql() { SailGraph graph = (SailGraph) graphTest.generateGraph(); SailGraphFactory.createTinkerGraph(graph); String query = "SELECT ?x ?y WHERE { ?x tg:knows ?y }"; this.stopWatch(); List<Map<String, Vertex>> results = graph.executeSparql(query); assertEquals(results.size(), 2); for (Map<String, Vertex> map : results) { assertEquals(map.get("x"), graph.getVertex("tg:1")); assertTrue(map.get("y").equals(graph.getVertex("tg:2")) || map.get("y").equals(graph.getVertex("tg:4"))); } graph.shutdown(); } public void testNamedGraphs() { SailGraph graph = (SailGraph) graphTest.generateGraph(); SailGraphFactory.createTinkerGraph(graph); int counter = 0; for (Edge edge : graph.getEdges()) { counter++; SailEdge se = (SailEdge) edge; assertNull(se.getNamedGraph()); assertNull(se.getProperty(SailTokens.NAMED_GRAPH)); assertFalse(se.hasNamedGraph()); } assertEquals(counter, 6); for (Edge edge : graph.getEdges()) { SailEdge se = (SailEdge) edge; se.setNamedGraph("http://agraph"); assertEquals(se.getNamedGraph(), "http://agraph"); assertEquals(se.getNamedGraph(), se.getProperty(SailTokens.NAMED_GRAPH)); assertTrue(se.hasNamedGraph()); } assertEquals(count(graph.getEdges()), 6); } public void testAddManyVertexProperties() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Set<Vertex> vertices = new HashSet<Vertex>(); this.stopWatch(); for (int i = 0; i < 50; i++) { Vertex vertex = graph.addVertex("\"" + UUID.randomUUID().toString() + "\""); for (int j = 0; j < 15; j++) { vertex.setProperty(SailTokens.DATATYPE, "http://www.w3.org/2001/XMLSchema#anyURI"); } vertices.add(vertex); } printPerformance(graph.toString(), 15 * 50, "vertex properties added (with vertices being added too)", this.stopWatch()); if (graph.getFeatures().supportsVertexIteration) assertEquals(count(graph.getVertices()), 50); assertEquals(vertices.size(), 50); for (Vertex vertex : vertices) { assertEquals(3, vertex.getPropertyKeys().size()); assertTrue(vertex.getPropertyKeys().contains(SailTokens.DATATYPE)); assertEquals("http://www.w3.org/2001/XMLSchema#anyURI", vertex.getProperty(SailTokens.DATATYPE)); assertTrue(vertex.getPropertyKeys().contains(SailTokens.VALUE)); assertEquals("literal", vertex.getProperty(SailTokens.KIND)); } graph.shutdown(); } public void testBasicAddVertex() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Vertex v1 = graph.addVertex("http://tinkerpop.com#marko"); assertEquals("http://tinkerpop.com#marko", v1.getId()); Vertex v2 = graph.addVertex("\"1\"^^<datatype:int>"); assertEquals("\"1\"^^<datatype:int>", v2.getId()); Vertex v3 = graph.addVertex("_:ABLANKNODE"); assertEquals(v3.getId(), "_:ABLANKNODE"); Vertex v4 = graph.addVertex("\"2.24\"^^<http://www.w3.org/2001/XMLSchema#double>"); assertEquals("\"2.24\"^^<http://www.w3.org/2001/XMLSchema#double>", v4.getId()); graph.shutdown(); } public void testAddVertexProperties() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Vertex v1 = graph.addVertex("\"1\"^^<http://www.w3.org/2001/XMLSchema#int>"); assertEquals("http://www.w3.org/2001/XMLSchema#int", v1.getProperty(SailTokens.DATATYPE)); assertEquals(1, v1.getProperty(SailTokens.VALUE)); assertNull(v1.getProperty(SailTokens.LANGUAGE)); assertNull(v1.getProperty("random something")); Vertex v2 = graph.addVertex("\"hello\"@en"); assertEquals("en", v2.getProperty(SailTokens.LANGUAGE)); assertEquals("hello", v2.getProperty(SailTokens.VALUE)); assertNull(v2.getProperty(SailTokens.DATATYPE)); assertNull(v2.getProperty("random something")); graph.shutdown(); } public void testRemoveVertexProperties() { SailGraph graph = (SailGraph) graphTest.generateGraph(); Vertex v1 = graph.addVertex("\"1\"^^<http://www.w3.org/2001/XMLSchema#int>"); assertEquals("http://www.w3.org/2001/XMLSchema#int", v1.removeProperty("type")); assertEquals("1", v1.getProperty("value")); assertNull(v1.getProperty("lang")); assertNull(v1.getProperty("random something")); Vertex v2 = graph.addVertex("\"hello\"@en"); assertEquals("en", v2.removeProperty("lang")); assertEquals("hello", v2.getProperty("value")); assertNull(v2.getProperty("type")); assertNull(v2.getProperty("random something")); graph.shutdown(); } public void testNavigateThroughLiteralVertex() { SailGraph graph = (SailGraph) graphTest.generateGraph(); SailGraphFactory.createTinkerGraph(graph); Vertex v1 = graph.getVertex("tg:1"); SailVertex vx = new SailVertex(new LiteralImpl("Marko"), graph); graph.addEdge(null, v1, vx, "tg:name"); Vertex v = v1.getEdges(Direction.OUT, "tg:name").iterator().next().getVertex(Direction.IN); assertEquals("Marko", v.getProperty(SailTokens.VALUE)); v1 = v.getEdges(Direction.IN, "tg:name").iterator().next().getVertex(Direction.OUT); assertEquals("http://tinkerpop.com#1", v1.getId()); } }