package org.aksw.jena_sparql_api.mapper.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.aksw.jena_sparql_api.concepts.PropertyRelation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.NavigableMap;
import java.util.TreeMap;
import org.apache.jena.graph.Node;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.expr.Expr;
import org.apache.jena.sparql.util.ExprUtils;
import org.apache.jena.vocabulary.RDF;
public class RdfSeqUtils {
public static final PropertyRelation seqRelation = PropertyRelation.create("?s ?p ?o . Filter(regex(?p, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_[0-9]+'))", "s", "p", "o");
public static final Expr seqExpr = ExprUtils.parse("regex(?p, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_[0-9]+')");
private static final Logger logger = LoggerFactory.getLogger(RdfSeqUtils.class);
/**
* Create a list from a navigable set with numbers as keys
*
* @param map
* @return
*/
public static <K extends Number & Comparable<? super K> , V> List<V> toList(Map<K, V> map) {
Number tmp = Collections.max(map.keySet());
int size = tmp == null ? 0 : tmp.intValue();
List<V> result = new ArrayList<V>(size);
result.addAll(Collections.nCopies(size, (V)null));
for(Entry<? extends Number, V> entry : map.entrySet()) {
Number key = entry.getKey();
int index = key.intValue();
V val = entry.getValue();
result.set(index, val);
}
return result;
}
/**
* Given a datasetGraph and an URI, obtain the raw list of nodes
*
* @param datasetGraph
* @return
*/
public List<Node> readSeq(DatasetGraph datasetGraph, Node g, Node s) {
//QueryExecutionFactory qef = new QueryExecutionFactoryDatasetGraph(datasetGraph, true);
//qef.createQueryExecution("Select ?p ?o {"
Iterator<Quad> it = datasetGraph.find(g, s, Node.ANY, Node.ANY);
NavigableMap<Integer, Node> indexToValue = new TreeMap<Integer, Node>();
String prefix = RDF.getURI() + "_";
int l = prefix.length();
while(it.hasNext()) {
Quad q = it.next();
Node o = q.getObject();
String p = q.getPredicate().getURI();
boolean isMembership = p.startsWith(prefix);
if(isMembership) {
String sub = p.substring(l);
Integer i = Integer.parseInt(sub);
if(i != null) {
indexToValue.put(i - 1, o);
} else {
logger.warn("Ignoring invalid index in seq: " + i);
}
}
}
List<Node> result = toList(indexToValue);
return result;
}
public static void writeSeq(DatasetGraph target, List<Node> items, Node g, Node s) {
// Write the ":s a rdf:Seq" quad
Quad type = new Quad(g, s, RDF.type.asNode(), RDF.Seq.asNode());
target.add(type);
for(int i = 0; i < items.size(); ++i) {
Node p = RDF.li(i + 1).asNode();
Node o = items.get(i);
if(o != null) {
Quad quad = new Quad(g, s, p, o);
target.add(quad);
}
}
}
}