001package org.dllearner.algorithms.qtl.operations.lgg.graph;
002
003import com.google.common.collect.Sets;
004import org.apache.jena.query.Syntax;
005import org.apache.jena.rdf.model.*;
006import org.apache.jena.riot.Lang;
007import org.apache.jena.vocabulary.RDF;
008import org.dllearner.algorithms.qtl.util.SPARQLEndpointEx;
009import org.dllearner.core.ComponentInitException;
010import org.dllearner.kb.SparqlEndpointKS;
011import org.dllearner.kb.sparql.ConciseBoundedDescriptionGenerator;
012import org.dllearner.kb.sparql.ConciseBoundedDescriptionGeneratorImpl;
013import org.dllearner.kb.sparql.SparqlEndpoint;
014
015import java.util.Set;
016
017/**
018 * @author Lorenz Buehmann
019 */
020public class LggGeneratorRDFGraph {
021
022    /**
023     * Computes the syntactic LGG also known as cover graph of the two given graphs.
024     *
025     * @param g1 first RDF graph
026     * @param g2 second RDF graph
027     * @return the cover graph resp. syntactic LGG
028     */
029    public Model lgg(Model g1, Model g2) {
030        Model lgg = ModelFactory.createDefaultModel();
031
032        // iterate over predicates occuring in both graphs
033        StmtIterator iter1 = g1.listStatements();
034        StmtIterator iter2 = g1.listStatements();
035
036        while(iter1.hasNext()) {
037            Statement s1 = iter1.next();
038            while(iter2.hasNext()) {
039                Statement s2 = iter2.next();
040
041                if(s1.getPredicate().equals(s2.getPredicate())) {
042                    Statement s12 = lgg(lgg, s1, s2);
043                    lgg.add(s12);
044                }
045            }
046        }
047
048        // remove redundant edges
049        prune(lgg);
050
051        return lgg;
052    }
053
054    private void prune(Model m) {
055        StmtIterator iter = m.listStatements(null, RDF.type, (RDFNode) null);
056        while(iter.hasNext()) {
057            Statement st = iter.next();
058            if(st.getObject().isAnon() && !m.contains(st.getObject().asResource(), null)) {
059                iter.remove();
060            };
061        }
062    }
063
064    private Statement lgg(Model model, Statement s1, Statement s2) {
065        Resource s = s1.getSubject().equals(s2.getObject())
066                ? s1.getSubject()
067                : model.createResource(AnonId.create(s1.getSubject().toString() + s2.getSubject().toString()));
068        RDFNode o = s1.getObject().equals(s2.getObject())
069                ? s1.getObject()
070                : model.createResource(AnonId.create(s1.getObject().toString() + s2.getObject().toString()));
071        return model.createStatement(s, s1.getPredicate(), o);
072    }
073
074    public static void main(String[] args) throws ComponentInitException {
075        SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia();
076        SparqlEndpointKS ks = new SparqlEndpointKS(endpoint);
077        ks.init();
078
079        Set<String> ignoredProperties = Sets.newHashSet(
080                "http://dbpedia.org/ontology/abstract",
081                "http://dbpedia.org/ontology/wikiPageID",
082                "http://dbpedia.org/ontology/wikiPageRevisionID",
083                "http://dbpedia.org/ontology/wikiPageID","http://www.w3.org/ns/prov#wasDerivedFrom", "http://dbpedia.org/ontology/wikiPageDisambiguates",
084                "http://dbpedia.org/ontology/wikiPageExternalLink");
085
086        ConciseBoundedDescriptionGenerator cbdGen = new ConciseBoundedDescriptionGeneratorImpl(ks.getQueryExecutionFactory());
087        cbdGen.setIgnoredProperties(ignoredProperties);
088        cbdGen.setAllowedPropertyNamespaces(Sets.newHashSet("http://dbpedia.org/ontology/"));
089        cbdGen.setAllowedClassNamespaces(Sets.newHashSet("http://dbpedia.org/ontology/"));
090
091        int depth = 2;
092
093        String ex1 = "http://dbpedia.org/resource/Taucha";
094        String ex2 = "http://dbpedia.org/resource/Borna";
095
096//        String ex1 = "http://dbpedia.org/resource/Leipzig";
097//        String ex2 = "http://dbpedia.org/resource/Dresden";
098
099        Model m1 = cbdGen.getConciseBoundedDescription(ex1, depth);
100        Model m2 = cbdGen.getConciseBoundedDescription(ex2, depth);
101
102        LggGeneratorRDFGraph lggGen = new LggGeneratorRDFGraph();
103        Model lgg = lggGen.lgg(m1, m2);
104
105        m1.write(System.out, Lang.TURTLE.getName(), "http://dbpedia.org/resource/");
106        m2.write(System.out, Lang.TURTLE.getName(), "http://dbpedia.org/resource/");
107
108        lgg.write(System.out, Lang.TURTLE.getName(), "http://dbpedia.org/resource/");
109
110    }
111}