
zone.cogni.semanticz.jsonldshaper.Rdf2JsonLd Maven / Gradle / Ivy
package zone.cogni.semanticz.jsonldshaper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.github.jsonldjava.core.JsonLdOptions;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.riot.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import zone.cogni.semanticz.jsonldshaper.utils.RdfUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Rdf2JsonLd {
private static final Logger log = LoggerFactory.getLogger(Rdf2JsonLd.class);
public static RDFWriterBuilder calculateJsonldWriter(Model shacl) {
return calculateJsonldWriter(shacl, true);
}
public static RDFWriterBuilder calculateJsonldWriter(Model shacl, boolean adaptDefaultNamespace) {
String jsonLdContext = calculateJsonldContextNode(shacl, adaptDefaultNamespace).toString();
JsonLDWriteContext context = new JsonLDWriteContext();
context.setJsonLDContext(jsonLdContext);
setContextOptions(context);
return RDFWriter.create()
.format(RDFFormat.JSONLD_COMPACT_PRETTY)
.context(context);
}
private static void setContextOptions(JsonLDWriteContext context) {
JsonLdOptions opts = new JsonLdOptions();
opts.setCompactArrays(false);
opts.setUseNativeTypes(false);
opts.setUseRdfType(false);
context.setOptions(opts);
}
private static ObjectNode calculateJsonldContextNode(Model shacl, boolean adaptDefaultNamespace) {
ObjectNode contextNode = JsonNodeFactory.instance.objectNode();
addDatatypeProperties(shacl, contextNode);
addResourceProperties(shacl, contextNode);
addClassProperties(shacl, contextNode);
addPrefixElements(shacl, contextNode, adaptDefaultNamespace);
addCommonContextElements(contextNode);
return contextNode;
}
private static void addPrefixElements(Model shacl, ObjectNode contextNode, boolean adaptDefaultNamespace) {
shacl.getNsPrefixMap()
.forEach((prefix, namespace) -> {
if (StringUtils.isEmpty(prefix) && adaptDefaultNamespace) {
contextNode.set("@vocab", getTextNode(namespace));
} else {
contextNode.set(prefix, getTextNode(namespace));
}
});
}
private static void addCommonContextElements(ObjectNode contextNode) {
contextNode.set("data", getTextNode("@graph"));
}
private static List getClassProperties(Model shacl) {
String propertiesQuery = getClassPropertiesQuery(shacl);
String inversePropertiesQuery = getClassInversePropertiesQuery(shacl);
return Stream.of(propertiesQuery, inversePropertiesQuery)
.map(query -> getShortUriReferences(shacl, query))
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
}
private static String getClassInversePropertiesQuery(Model shacl) {
StringBuilder builder = new StringBuilder();
appendPrefixedToQuery(shacl, builder);
builder.append("\n" +
"select ?property { \n" +
" ?s sh:path [sh:inversePath ?property]. \n" +
" filter exists { \n" +
" ?s sh:class ?class. \n" +
" filter (?class not in (sh:and, sh:not, sh:or, sh:xone)) \n" +
" }\n" +
"}" +
"order by ?property");
return builder.toString();
}
private static String getClassPropertiesQuery(Model shacl) {
StringBuilder builder = new StringBuilder();
appendPrefixedToQuery(shacl, builder);
builder.append("\n" +
"select ?property { \n" +
" ?s sh:path ?property. \n" +
" filter(!isBlank(?property)). \n" +
" filter exists { \n" +
" ?s sh:class ?class. \n" +
" filter (?class not in (sh:and, sh:not, sh:or, sh:xone)) \n" +
" }\n" +
"}" +
"order by ?property");
return builder.toString();
}
private static void addClassProperties(Model shacl, ObjectNode contextNode) {
addShortUriReference(contextNode, shacl, getClassProperties(shacl));
}
private static void addResourceProperties(Model shacl, ObjectNode contextNode) {
addShortUriReference(contextNode, shacl, getResourceProperties(shacl));
}
private static List getResourceProperties(Model shacl) {
String query = getResourcePropertiesQuery(shacl);
return getShortUriReferences(shacl, query);
}
private static void addShortUriReference(ObjectNode contextNode,
Model shacl,
List shortUriReferences) {
shortUriReferences
.forEach(classProperty -> {
String curie = shacl.shortForm(classProperty);
ObjectNode classPropertyNode = JsonNodeFactory.instance.objectNode();
classPropertyNode.set("@id", getTextNode(curie));
classPropertyNode.set("@type", getTextNode("@id"));
contextNode.set(curie, classPropertyNode);
});
}
private static List getShortUriReferences(Model shacl, String query) {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy