package edu.isi.karma.kr2rml.writer; import java.io.PrintWriter; import java.net.URI; import java.net.URISyntaxException; import java.util.Properties; import edu.isi.karma.kr2rml.PredicateObjectMap; import edu.isi.karma.kr2rml.mapping.R2RMLMappingIdentifier; import edu.isi.karma.kr2rml.planning.TriplesMap; import edu.isi.karma.modeling.Uris; public class BloomFilterKR2RMLRDFWriter extends KR2RMLRDFWriter { protected KR2RMLBloomFilterManager bloomFilterManager; protected PrintWriter output; protected boolean isRDF; private final static String formattedTypeURI = "<" + Uris.RDF_TYPE_URI +">"; private String baseURI; public BloomFilterKR2RMLRDFWriter(PrintWriter output, boolean isRDF, String baseURI) { initialize(output, isRDF, baseURI); } @Override public void initialize(Properties p ) { } private void initialize(PrintWriter output, boolean isRDF, String baseURI) { this.output = output; this.isRDF = isRDF; this.baseURI = baseURI; } public void setR2RMLMappingIdentifier(R2RMLMappingIdentifier mappingIdentifer) { bloomFilterManager = new KR2RMLBloomFilterManager(mappingIdentifer); } @Override public void outputTripleWithURIObject(String subjUri, String predicateUri, String objectUri) { return; } @Override public void outputTripleWithURIObject(PredicateObjectMap predicateObjectMap, String subjUri, String predicateUri, String objectUri) { if (subjUri.indexOf("<") != -1 && subjUri.indexOf(">") != -1) { String tmp = subjUri.substring(1, subjUri.length() - 1); subjUri = "<" + normalizeURI(tmp) + ">"; } if (objectUri.indexOf("<") != -1 && objectUri.indexOf(">") != -1) { String tmp = objectUri.substring(1, objectUri.length() - 1); objectUri = "<" + normalizeURI(tmp) + ">"; } TriplesMap subjTriplesMap = predicateObjectMap.getTriplesMap(); bloomFilterManager.addUriToBloomFilter(subjTriplesMap.getId(), subjUri); if(predicateUri.equalsIgnoreCase(formattedTypeURI)) { return; } bloomFilterManager.addUriToBloomFilter(predicateObjectMap.getId(), subjUri); if(predicateObjectMap.getObject().hasRefObjectMap()) { bloomFilterManager.addUriToBloomFilter(predicateObjectMap.getObject().getRefObjectMap().getId(), objectUri); } } @Override public void outputTripleWithLiteralObject(String subjUri, String predicateUri, String value, String literalType, String language) { return; } @Override public void outputTripleWithLiteralObject( PredicateObjectMap predicateObjectMap, String subjUri, String predicateUri, String value, String literalType, String language) { if (subjUri.indexOf("<") != -1 && subjUri.indexOf(">") != -1) { String tmp = subjUri.substring(1, subjUri.length() - 1); subjUri = "<" + normalizeURI(tmp) + ">"; } TriplesMap subjTriplesMap = predicateObjectMap.getTriplesMap(); bloomFilterManager.addUriToBloomFilter(subjTriplesMap.getId(), subjUri); if(predicateUri.equalsIgnoreCase(formattedTypeURI)) { return; } bloomFilterManager.addUriToBloomFilter(predicateObjectMap.getId(), subjUri); } @Override public void outputQuadWithLiteralObject(String subjUri, String predicateUri, String value, String literalType, String language, String graph) { return; } @Override public void outputQuadWithLiteralObject( PredicateObjectMap predicateObjectMap, String subjUri, String predicateUri, String value, String literalType, String language, String graph) { if (subjUri.indexOf("<") != -1 && subjUri.indexOf(">") != -1) { String tmp = subjUri.substring(1, subjUri.length() - 1); subjUri = "<" + normalizeURI(tmp) + ">"; } TriplesMap subjTriplesMap = predicateObjectMap.getTriplesMap(); bloomFilterManager.addUriToBloomFilter(subjTriplesMap.getId(), subjUri); if(predicateUri.equalsIgnoreCase(formattedTypeURI)) { return; } bloomFilterManager.addUriToBloomFilter(predicateObjectMap.getId(), subjUri); } @Override public void finishRow() { return; } @Override public void flush() { return; } @Override public void close() { if (!isRDF) output.write(bloomFilterManager.toJSON().toString(4)); else { output.write(bloomFilterManager.toRDF()); } output.flush(); output.close(); } private String normalizeURI(String URI) { try { URI = URI.replace(" ", ""); URI uri = new URI(URI); if (!uri.isAbsolute() && baseURI != null) return baseURI + URI; }catch(URISyntaxException e) { if (baseURI != null) return baseURI + URI; else return URI; } return URI; } }