package org.aksw.jena_sparql_api.views; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.rdf.model.AnonId; import org.apache.jena.sparql.expr.NodeValue; import org.apache.jena.sparql.function.FunctionBase4; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RdfTerm extends FunctionBase4 { private static final Logger logger = LoggerFactory.getLogger(RdfTerm.class); public static String toLexicalForm(NodeValue nodeValue) { return nodeValue.asUnquotedString(); } /** * type, lexical value, language tag, data type * */ @Override public NodeValue exec(NodeValue type, NodeValue node, NodeValue langTag, NodeValue datatype) { return eval(type, node, langTag, datatype); } public static NodeValue eval(NodeValue type, NodeValue node, NodeValue langTag, NodeValue datatype) { String lexicalForm = toLexicalForm(node); int typeValue = type.getDecimal().intValue(); switch(typeValue) { case 0: // Blank Node NodeValue result = NodeValue.makeNode(NodeFactory.createBlankNode(toLexicalForm(node))); return result; case 1: // URI return NodeValue.makeNode(NodeFactory.createURI(toLexicalForm(node))); case 2: // Plain Literal String dt = toLexicalForm(datatype); if(dt != null && !dt.isEmpty()) { logger.warn("Language tag should be null or empty, was '" + dt + "'"); } return NodeValue.makeNode(lexicalForm, toLexicalForm(langTag), (String)null); case 3: // Typed Literal String lang = toLexicalForm(langTag); if(lang != null && !lang.isEmpty()) { logger.warn("Language tag should be null or empty, was '" + lang + "'"); } return NodeValue.makeNode(lexicalForm, null, toLexicalForm(datatype)); } throw new RuntimeException("Invalid type-value for RdfTerm: " + typeValue); //return null; } /* Old version - assumes strings for lang and datatype @Override public NodeValue exec(NodeValue type, NodeValue node, NodeValue langTag, NodeValue datatype) { String lexicalForm = toLexicalForm(node); int typeValue = type.getDecimal().intValue(); switch(typeValue) { case 0: // Blank Node return NodeValue.makeNode(Node.createAnon(new AnonId(node.getString()))); case 1: // URI return NodeValue.makeNode(Node.createURI(node.getString())); case 2: // Plain Literal String dt = datatype.getString(); if(dt != null && !dt.isEmpty()) { logger.warn("Language tag should be null or empty, was '" + dt + "'"); } return NodeValue.makeNode(lexicalForm, langTag.getString(), (String)null); case 3: // Typed Literal String lang = langTag.getString(); if(lang != null && !lang.isEmpty()) { logger.warn("Language tag should be null or empty, was '" + lang + "'"); } return NodeValue.makeNode(lexicalForm, null, datatype.getString()); } throw new RuntimeException("Invalid type-value for RdfTerm: " + typeValue); //return null; } */ }