package edu.asu.spring.quadriga.service.network.transform.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import edu.asu.spring.quadriga.conceptpower.IConceptpowerConnector; import edu.asu.spring.quadriga.domain.impl.ConceptpowerReply; /** * This class transformes graphs that were found by the {@link PatternFinder} * into {@link TransformNode}s and {@link TransformLink}s. Transformed nodes and links * are enriched with additional information such as time and place. * * @author Julia Damerow * */ public class Transformer { private IConceptpowerConnector conceptpower; private Map<String, TransformLink> statementLinkMap; public Transformer(IConceptpowerConnector conceptpower) { this.conceptpower = conceptpower; statementLinkMap = new HashMap<String, TransformLink>(); } public List<TransformNode> transform(List<Node> graphs, TransformNode transformNode) { List<TransformNode> transformedGraphs = new ArrayList<TransformNode>(); for (Node gNode : graphs) { Map<String, Node> nodeIdMap = new HashMap<String, Node>(); putIds(gNode, nodeIdMap); TransformNode mappedGraph = transformNodes(nodeIdMap, transformNode); if (mappedGraph != null) transformedGraphs.add(mappedGraph); } return transformedGraphs; } protected void putIds(Node node, Map<String, Node> ids) { if (node.getId() != null) { ids.put(node.getId(), node); } if (node instanceof Relation) { putIds(((Relation) node).getSubject(), ids); putIds(((Relation) node).getPredicate(), ids); putIds(((Relation) node).getObject(), ids); } } protected TransformNode transformNodes(Map<String, Node> nodes, TransformNode mapping) { TransformNode mappedNode = new TransformNode(); mappedNode.setId(UUID.randomUUID().toString()); String concept = mapping.getConcept(); if (concept != null) { mappedNode.setConcept(concept); ConceptpowerReply reply = conceptpower.getById(concept); if (reply != null) { if (reply.getConceptEntry().size() > 0) { mappedNode.setConceptName(reply.getConceptEntry().get(0).getLemma()); } } } else { String correspondingId = mapping.getCorrespondingId(); Node corrNode = nodes.get(correspondingId); if (corrNode != null) { mappedNode.setConcept(corrNode.getConcept()); mappedNode.setType(corrNode.getType()); mappedNode.setCorrespondingId(correspondingId); ConceptpowerReply reply = conceptpower.getById(corrNode.getConcept()); if (reply != null) { if (reply.getConceptEntry().size() > 0) { mappedNode.setConceptName(reply.getConceptEntry().get(0).getLemma()); } } mappedNode.setTerms(corrNode.getTerms()); } } if (mapping.getLinks() != null) { for (TransformLink link : mapping.getLinks()) { /* * if a link represents a statement we need to make sure that * triples attaching to that statement like start and end * are added to the same statement */ TransformLink mappedLink = null; if (link.getRepresentedStatement() != null) { String stateId = link.getRepresentedStatement(); Node statementNode = nodes.get(stateId); if (statementNode.getEventId() != null) { mappedLink = statementLinkMap.get(statementNode.getEventId()); } } if (mappedLink == null) { mappedLink = new TransformLink(); mappedLink.setId(UUID.randomUUID().toString()); mappedLink.setSubject(mappedNode); if (link.getRepresentedStatement() != null) { String stateId = link.getRepresentedStatement(); Node statementNode = nodes.get(stateId); if (statementNode.getEventId() != null) { statementLinkMap.put(statementNode.getEventId(), mappedLink); } } } // if the link has a specified concept if (link.getConcept() != null) { mappedLink.setConcept(link.getConcept()); ConceptpowerReply reply = conceptpower.getById(link.getConcept()); if (reply != null) { if (reply.getConceptEntry().size() > 0) { mappedLink.setConceptName(reply.getConceptEntry().get(0).getLemma()); } } } /* * if the link has a specified node to take information from, * use the information rather than the concept */ String corrId = link.getCorrespondingId(); if (corrId != null && !corrId.isEmpty()) { Node corrNode = nodes.get(corrId); if (corrNode != null) { mappedLink.setConcept(corrNode.getConcept()); mappedLink.setType(corrNode.getType()); mappedLink.setCorrespondingId(corrId); ConceptpowerReply reply = conceptpower.getById(corrNode.getConcept()); if (reply != null) { if (reply.getConceptEntry().size() > 0) { mappedLink.setConceptName(reply.getConceptEntry().get(0).getLemma()); } } } } // map start time String startTimeId = link.getStartTime(); if (startTimeId != null) { Node startNode = nodes.get(startTimeId); if (startNode != null) { mappedLink.setStartTime(startNode.getConcept()); } } // map end time String endTimeId = link.getEndTime(); if (endTimeId != null) { Node endNode = nodes.get(endTimeId); if (endNode != null) { mappedLink.setEndTime(endNode.getConcept()); } } // map occur time String occursId = link.getOccurTime(); if (occursId != null) { Node occurNode = nodes.get(occursId); if (occurNode != null) { mappedLink.setOccurTime(occurNode.getConcept()); } } // map place String placeId = link.getPlace(); if (placeId != null) { Node node = nodes.get(placeId); if (node != null) { mappedLink.setPlace(node.getConcept()); } } /* * If the link has an object go on recursively to fill * the object node */ TransformNode linkedNode = link.getObject(); if (linkedNode != null) { TransformNode mappedLinkedNode = transformNodes(nodes, linkedNode); mappedLink.setObject(mappedLinkedNode); } // add link to root node if (mappedNode.getLinks() == null) mappedNode.setLinks(new ArrayList<TransformLink>()); mappedNode.getLinks().add(mappedLink); } } return mappedNode; } public String getTurtle(TransformNode node) { StringBuffer sb = new StringBuffer(); createTurtle(node, sb); return sb.toString(); } protected void createTurtle(TransformNode node, StringBuffer output) { if (node.getLinks() == null) return; for (TransformLink link : node.getLinks()) { output.append("<" + node.getConcept() + "> "); output.append("<" + link.getConcept() + ">"); output.append("<" + link.getObject().getConcept() + ">. \n"); createTurtle(link.getObject(), output); } } }