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}