/******************************************************************************* * Copyright 2014 University of Southern California * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This code was developed by the Information Integration Group as part * of the Karma project at the Information Sciences Institute of the * University of Southern California. For more information, publications, * and related projects, please see: http://www.isi.edu/integration ******************************************************************************/ package edu.isi.karma.kr2rml.planning; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import edu.isi.karma.controller.command.selection.SuperSelection; import edu.isi.karma.kr2rml.ObjectMap; import edu.isi.karma.kr2rml.Predicate; import edu.isi.karma.kr2rml.PredicateObjectMap; import edu.isi.karma.kr2rml.URIFormatter; import edu.isi.karma.kr2rml.exception.HNodeNotFoundKarmaException; import edu.isi.karma.kr2rml.mapping.KR2RMLMapping; import edu.isi.karma.kr2rml.mapping.KR2RMLMappingColumnNameHNodeTranslator; import edu.isi.karma.kr2rml.template.PopulatedTemplateTermSet; import edu.isi.karma.kr2rml.template.StringTemplateTerm; import edu.isi.karma.kr2rml.template.TemplateTermSet; import edu.isi.karma.kr2rml.writer.KR2RMLRDFWriter; import edu.isi.karma.modeling.Prefixes; import edu.isi.karma.modeling.Uris; import edu.isi.karma.rep.RepFactory; import edu.isi.karma.rep.Row; public class TriplesMapWorkerPlan { private Logger LOG = LoggerFactory.getLogger(TriplesMapWorkerPlan.class); private RepFactory factory; private TriplesMap triplesMap; private KR2RMLMapping kr2rmlMapping; private SubjectMapPlan subjectMapPlan; private Deque<PredicateObjectMappingPlan> internalLinksPlans; private Deque<PredicateObjectMappingPlan> columnLinksPlans; private Deque<PredicateObjectMappingPlan> constantLinksPlans; private SuperSelection selection; private URIFormatter uriFormatter; private KR2RMLMappingColumnNameHNodeTranslator translator; private boolean generateContext; private Map<String, String> hNodeToContextUriMap; private Map<TriplesMapGraph, List<String>> graphTriplesMapsProcessingOrder; public TriplesMapWorkerPlan(RepFactory factory, TriplesMap triplesMap, KR2RMLMapping kr2rmlMapping, URIFormatter uriFormatter, KR2RMLMappingColumnNameHNodeTranslator translator, boolean generateContext, Map<String, String> hNodeToContextUriMap, SuperSelection sel, Map<TriplesMapGraph, List<String>> graphTriplesMapsProcessingOrder) throws HNodeNotFoundKarmaException { this.factory = factory; this.triplesMap = triplesMap; this.kr2rmlMapping = kr2rmlMapping; this.uriFormatter = uriFormatter; this.translator = translator; this.generateContext = generateContext; this.hNodeToContextUriMap = hNodeToContextUriMap; this.selection = sel; this.graphTriplesMapsProcessingOrder = graphTriplesMapsProcessingOrder; generate(); } public void generate() throws HNodeNotFoundKarmaException { subjectMapPlan = new SubjectMapPlan(triplesMap, kr2rmlMapping,uriFormatter, factory, translator, selection); internalLinksPlans = new LinkedList<>(); List<TriplesMapLink> links = null; for(TriplesMapGraph graph : graphTriplesMapsProcessingOrder.keySet()) { if(graph.getTriplesMapIds().contains(triplesMap.getId())) { links = graph.getAllNeighboringTriplesMap(triplesMap.getId()); break; } } for(TriplesMapLink link : links) { try { if(link.getSourceMap().getId().compareTo(triplesMap.getId()) ==0 && !link.isFlipped() || link.getTargetMap().getId().compareTo(triplesMap.getId()) == 0 && link.isFlipped()) { PredicateObjectMap pom = link.getPredicateObjectMapLink(); TriplesMap objectTriplesMap; if(link.isFlipped()) { objectTriplesMap = link.getSourceMap(); } else { objectTriplesMap = link.getTargetMap(); } PredicateObjectMappingPlan pomPlan = new InternalPredicateObjectMappingPlan(subjectMapPlan.getTemplate(), pom, objectTriplesMap, subjectMapPlan.getSubjectTermsToPaths(),link.isFlipped(), kr2rmlMapping,uriFormatter, factory, translator, selection); if(link.isFlipped()) { internalLinksPlans.addFirst(pomPlan); } else { internalLinksPlans.addLast(pomPlan); } } } catch (Exception e) { LOG.error("Unable to generate plan for link " + link.getSourceMap().getId() + " " + link.getPredicateObjectMapLink().getPredicate().getId() + " " + link.getTargetMap().getId(), e); } } columnLinksPlans = new LinkedList<>(); constantLinksPlans = new LinkedList<>(); // Subject // Generate triples for specifying the types for (TemplateTermSet typeTerm:triplesMap.getSubject().getRdfsType()) { PredicateObjectMap pom = new PredicateObjectMap(Prefixes.KARMA_DEV + PredicateObjectMap.getNewId(),triplesMap); pom.setObject(new ObjectMap(factory.getNewId("objectmap"), typeTerm, null)); Predicate typePredicate = new Predicate(factory.getNewId("predicate")); TemplateTermSet typeTemplate = new TemplateTermSet(); typeTemplate.addTemplateTermToSet(new StringTemplateTerm(Uris.RDF_TYPE_URI)); typePredicate.setTemplate(typeTemplate); pom.setPredicate(typePredicate); PredicateObjectMappingPlan pomPlan = new ColumnPredicateObjectMappingPlan(subjectMapPlan.getTemplate(), pom, subjectMapPlan.getSubjectTermsToPaths(), kr2rmlMapping,uriFormatter, factory, translator, hNodeToContextUriMap, generateContext, selection); columnLinksPlans.add(pomPlan); } for(PredicateObjectMap pom : triplesMap.getPredicateObjectMaps()) { LOG.debug("Processing " + pom.toString()); if(pom.getObject().hasRefObjectMap()) { LOG.debug("Skipping " + pom.toString()); continue; } if(pom.getPredicate().toString().contains("classLink")) { LOG.debug("Skipping " + pom.toString()); continue; } try{ PredicateObjectMappingPlan pomPlan; if(pom.getObject().getTemplate().getAllColumnNameTermElements().isEmpty()) { pomPlan = new ConstantPredicateObjectMappingPlan(subjectMapPlan.getTemplate(), pom, kr2rmlMapping,subjectMapPlan.getSubjectTermsToPaths(), uriFormatter, factory, translator, selection); constantLinksPlans.add(pomPlan); } else { pomPlan = new ColumnPredicateObjectMappingPlan(subjectMapPlan.getTemplate(), pom, subjectMapPlan.getSubjectTermsToPaths(), kr2rmlMapping,uriFormatter, factory, translator, hNodeToContextUriMap, generateContext, selection); columnLinksPlans.add(pomPlan); } } catch (Exception e) { LOG.error("Unable to generate plan for pom " + pom.getId(), e); } } } public void execute(Row r, List<KR2RMLRDFWriter> outWriters) { List<PopulatedTemplateTermSet> subjects = subjectMapPlan.execute(r); for(PredicateObjectMappingPlan internalLinkPlan : internalLinksPlans) { internalLinkPlan.outputTriples(outWriters, internalLinkPlan.execute(r, subjects), r); } for(PredicateObjectMappingPlan columnLinkPlan : columnLinksPlans) { columnLinkPlan.outputTriples(outWriters, columnLinkPlan.execute(r, subjects), r); } for(PredicateObjectMappingPlan constantLinkPlan : constantLinksPlans) { constantLinkPlan.outputTriples(outWriters, constantLinkPlan.execute(r, subjects), r); } } }