package esl.cuenet.ranking.network;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.*;
import esl.cuenet.model.Constants;
import esl.cuenet.ranking.EventEntityNetwork;
import esl.cuenet.ranking.TextIndex;
import esl.cuenet.ranking.TypedEdge;
import esl.cuenet.ranking.URINode;
import org.apache.log4j.Logger;
import java.util.HashMap;
public class NeoOntologyImporter {
private final OntModel model;
private HashMap<String, URINode> nodeMap = null;
private HashMap<String, URINode> blankNodeMap = new HashMap<String, URINode>(100);
public static final String nodeURIIndexName = "nodeURIIndex";
private TextIndex uriIndex = null;
private Logger logger = Logger.getLogger(NeoOntologyImporter.class);
public NeoOntologyImporter(OntModel model) {
this.model = model;
}
public void loadIntoGraph(EventEntityNetwork network) {
nodeMap = new HashMap<String, URINode>(500);
uriIndex = network.textIndex(nodeURIIndexName);
// StmtIterator stmts = model.listStatements();
// int c = 0;
// while (stmts.hasNext()) {
// c++;
// Statement s = stmts.next(); //6168255
// if (c % 100000 == 0) logger.info(c + " " + s.getSubject() + " <=> " + s.getPredicate() + " <=> " + s.getObject());
// }
// logger.info("c = " + c);
// System.exit(1);
StmtIterator stmts = model.listStatements();
int c = 0;
while (stmts.hasNext()) {
c++;
Statement statement = stmts.next();
loadIntoGraph(network, statement.getSubject(), statement.getPredicate(), statement.getObject());
if (c % 100000 == 0) logger.info(c + " " + statement.getSubject() + " <=> " + statement.getPredicate() + " <=> " + statement.getObject());
}
logger.info("Loaded c = " + c + " triples.");
//modify blank nodes URIs
int i = 0;
for (String blankNodeURI: blankNodeMap.keySet()) {
URINode bn = blankNodeMap.get(blankNodeURI);
String uri = Constants.CuenetNamespace + Constants.BlankNode + i;
bn.setProperty(OntProperties.ONT_URI, uri);
uriIndex.put(bn, OntProperties.ONT_URI, uri);
i++;
}
}
private void loadIntoGraph(EventEntityNetwork network, Resource subject, Property predicate, RDFNode object) {
if (subject.isAnon() || object.isAnon()) {
loadBlank(network, subject, predicate, object);
// logger.info("BLANK " + subject + " <=> " + predicate + " <=> " + object);
// logger.info("BLANK " + subject.isAnon() + " " + object.isAnon());
return;
}
if ( !object.isResource() ) return;
// logger.info(subject + " <=> " + predicate + " <=> " + object);
//find Node corresponding to subject
URINode subjectNode;
String subjectURI = subject.getURI();
if ( !nodeMap.containsKey(subjectURI) ) {
subjectNode = network.createNode();
subjectNode.setProperty(OntProperties.ONT_URI, subjectURI);
uriIndex.put(subjectNode, OntProperties.ONT_URI, subjectURI);
nodeMap.put(subjectURI, subjectNode);
}
else subjectNode = nodeMap.get(subject.getURI());
//find Node corresponding to object
URINode objectNode;
String objectURI = object.asResource().toString();
if ( !nodeMap.containsKey(object.asResource().toString())) {
objectNode = network.createNode();
objectNode.setProperty(OntProperties.ONT_URI, objectURI);
uriIndex.put(objectNode, OntProperties.ONT_URI, objectURI);
nodeMap.put(objectURI, objectNode);
}
else objectNode = nodeMap.get(objectURI);
TypedEdge edge = subjectNode.createEdgeTo(objectNode);
edge.setProperty(OntProperties.ONT_URI, predicate.getURI());
// logger.info(subjectURI + " <=> " + predicate.getURI() + " <=> " + objectURI);
}
private void loadBlank(EventEntityNetwork network, Resource subject, Property predicate, RDFNode object) {
//find Node corresponding to subject
URINode subjectNode;
String subjectURI;
HashMap<String, URINode> subjectMap;
if (subject.isAnon()) {
subjectMap = blankNodeMap;
subjectURI = "B" + subject.asNode().getBlankNodeLabel();
}
else {
subjectMap = nodeMap;
subjectURI = subject.getURI();
}
if ( !subjectMap.containsKey(subjectURI) ) {
subjectNode = network.createNode();
subjectNode.setProperty(OntProperties.ONT_URI, subjectURI);
if ( !subject.isAnon() ) uriIndex.put(subjectNode, OntProperties.ONT_URI, subjectURI);
subjectMap.put(subjectURI, subjectNode);
}
else subjectNode = subjectMap.get(subjectURI);
//find Node corresponding to object
URINode objectNode;
String objectURI;
HashMap<String, URINode> objectMap;
if (object.asNode().isBlank()) {
objectMap = blankNodeMap;
objectURI = "B" + object.asNode().getBlankNodeLabel();
}
else {
objectMap = nodeMap;
objectURI = object.asResource().getURI();
}
if ( !objectMap.containsKey(objectURI) ) {
objectNode = network.createNode();
objectNode.setProperty(OntProperties.ONT_URI, objectURI);
if ( !object.isAnon() ) uriIndex.put(objectNode, OntProperties.ONT_URI, objectURI);
objectMap.put(objectURI, objectNode);
}
else objectNode = objectMap.get(objectURI);
TypedEdge edge = subjectNode.createEdgeTo(objectNode);
edge.setProperty(OntProperties.ONT_URI, predicate.getURI());
// logger.info(subjectURI + " <=> " + predicate + " <=> " + objectURI);
}
public void mapGraph(EventEntityNetwork network) {
}
}