package com.mysema.rdfbean.jena;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.rdfbean.TEST;
import com.mysema.rdfbean.model.Format;
import com.mysema.rdfbean.model.LIT;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.QueryLanguage;
import com.mysema.rdfbean.model.RDF;
import com.mysema.rdfbean.model.RDFS;
import com.mysema.rdfbean.model.SPARQLQuery;
import com.mysema.rdfbean.model.STMT;
import com.mysema.rdfbean.model.UID;
public class SPARQLQueryTest extends AbstractConnectionTest {
private static final String CONSTRUCT_LIMIT_10 = "CONSTRUCT { ?s ?p ?o } WHERE {?s ?p ?o} LIMIT 10";
private static final String SELECT_LIMIT_10 = "SELECT ?s ?p ?o WHERE {?s ?p ?o} LIMIT 10";
@Before
public void setUp() {
super.setUp();
List<STMT> stmts = Arrays.asList(new STMT(RDF.type, RDF.type, RDF.Property));
connection.update(null, stmts);
}
@Test
public void Ask() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, "ASK { ?s ?p ?o }");
assertEquals(SPARQLQuery.ResultType.BOOLEAN, query.getResultType());
assertTrue(query.getBoolean());
}
@Test
public void Ask_with_False_result() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, "ASK { ?s <test:test> ?o }");
assertEquals(SPARQLQuery.ResultType.BOOLEAN, query.getResultType());
assertFalse(query.getBoolean());
}
@Test
public void Select() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, SELECT_LIMIT_10);
assertEquals(SPARQLQuery.ResultType.TUPLES, query.getResultType());
assertEquals(Arrays.asList("s", "p", "o"), query.getVariables());
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertTrue(rows.hasNext());
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
System.out.println(row.get("s") + " " + row.get("p") + " " + row.get("o"));
}
rows.close();
}
@Test
public void Select_No_Results() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, "SELECT * WHERE {?s <xxx:xxx> ?o} LIMIT 10");
assertEquals(SPARQLQuery.ResultType.TUPLES, query.getResultType());
assertEquals(Arrays.asList("s", "o"), query.getVariables());
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertFalse(rows.hasNext());
rows.close();
}
@Test
public void Select_with_QueryTime() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, SELECT_LIMIT_10);
query.setMaxQueryTime(1);
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertTrue(rows.hasNext());
while (rows.hasNext()) {
rows.next();
}
rows.close();
}
@Test
public void Select_with_Bindings() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, SELECT_LIMIT_10);
query.setBinding("p", RDF.type);
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertTrue(rows.hasNext());
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
assertEquals(RDF.type, row.get("p"));
}
rows.close();
}
@Test
@Ignore
public void Select_with_Resource_Binding_no_Match() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, SELECT_LIMIT_10);
query.setBinding("p", new UID(TEST.NS, "p" + System.currentTimeMillis()));
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
try {
assertFalse(rows.hasNext());
} finally {
rows.close();
}
}
@Test
@Ignore
public void Select_with_Literal_Binding_no_Match() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, SELECT_LIMIT_10);
query.setBinding("o", new LIT(UUID.randomUUID().toString()));
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
try {
assertFalse(rows.hasNext());
} finally {
rows.close();
}
}
@Test
@Ignore
public void Select_with_Bindings_in_Projection() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, "SELECT ?s ?label ?o WHERE {?s ?p ?o} LIMIT 10");
query.setBinding("label", RDFS.label);
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertTrue(rows.hasNext());
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
System.out.println(row);
assertEquals(RDFS.label, row.get("label"));
}
rows.close();
}
@Test
public void Construct() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, CONSTRUCT_LIMIT_10);
assertEquals(SPARQLQuery.ResultType.TRIPLES, query.getResultType());
CloseableIterator<STMT> triples = query.getTriples();
assertTrue(triples.hasNext());
while (triples.hasNext()) {
STMT triple = triples.next();
System.out.println(triple);
}
triples.close();
}
@Test
public void Construct_Multiple_Patterns() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL,
"PREFIX rdf: <" + RDF.NS + ">\n" +
"CONSTRUCT { ?s ?p ?o . ?s rdf:type ?type } " +
"WHERE {?s ?p ?o . ?s rdf:type ?type } LIMIT 10");
assertEquals(SPARQLQuery.ResultType.TRIPLES, query.getResultType());
CloseableIterator<STMT> triples = query.getTriples();
assertTrue(triples.hasNext());
while (triples.hasNext()) {
STMT triple = triples.next();
System.out.println(triple);
}
triples.close();
}
@Test
public void Construct_Stream_Triples() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, CONSTRUCT_LIMIT_10);
assertEquals(SPARQLQuery.ResultType.TRIPLES, query.getResultType());
StringWriter w = new StringWriter();
query.streamTriples(w, Format.RDFXML.getMimetype());
assertTrue(w.toString().contains("rdf:RDF"));
}
@Test
public void Select_and_Describe() {
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, "SELECT ?s WHERE {?s ?p ?o} LIMIT 10");
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
assertEquals(Arrays.asList("s"), query.getVariables());
assertTrue(rows.hasNext());
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
NODE subject = row.get("s");
if (subject.isURI()) {
SPARQLQuery describe = connection.createQuery(QueryLanguage.SPARQL, "DESCRIBE <" + subject.getValue() + ">");
CloseableIterator<STMT> triples = describe.getTriples();
assertTrue(triples.hasNext());
while (triples.hasNext()) {
STMT triple = triples.next();
System.out.println(triple);
}
triples.close();
}
}
}
@Test
public void LongQuery() {
StringBuilder qry = new StringBuilder();
qry.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
qry.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
qry.append("PREFIX dc: <http://purl.org/dc/elements/1.1/>\n");
qry.append("PREFIX scv: <http://purl.org/NET/scovo#>\n");
qry.append("PREFIX skos: <http://www.w3.org/2004/02/skos/core#>\n");
qry.append("SELECT ?dimensionType ?dimensionTypeName ?dimension ?dimensionDescription ?dimensionName ?parent\n");
qry.append("WHERE {\n");
qry.append("?dimensionType rdfs:subClassOf scv:Dimension ; dc:title ?dimensionTypeName .\n");
qry.append("?dimension rdf:type ?dimensionType ; dc:title ?dimensionName .\n");
qry.append("OPTIONAL { ?dimension dc:description ?dimensionDescription } .OPTIONAL { ?dimension skos:broader ?parent } . }\n");
qry.append("ORDER BY ?dimensionName\n");
SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, qry.toString());
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
while (rows.hasNext()) {
System.out.println(rows.next());
}
rows.close();
}
}