Package edu.isi.karma.modeling.alignment

Source Code of edu.isi.karma.modeling.alignment.GraphUtil

/*******************************************************************************
* Copyright 2012 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.modeling.alignment;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.jgrapht.DirectedGraph;
import org.jgrapht.Graph;
import org.jgrapht.UndirectedGraph;
import org.jgrapht.graph.DirectedWeightedMultigraph;
import org.jgrapht.graph.WeightedMultigraph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.alignment.ClassInstanceLink;
import edu.isi.karma.rep.alignment.ColumnNode;
import edu.isi.karma.rep.alignment.ColumnSubClassLink;
import edu.isi.karma.rep.alignment.CompactObjectPropertyLink;
import edu.isi.karma.rep.alignment.CompactSubClassLink;
import edu.isi.karma.rep.alignment.DataPropertyLink;
import edu.isi.karma.rep.alignment.DataPropertyOfColumnLink;
import edu.isi.karma.rep.alignment.DefaultLink;
import edu.isi.karma.rep.alignment.DisplayModel;
import edu.isi.karma.rep.alignment.InternalNode;
import edu.isi.karma.rep.alignment.Label;
import edu.isi.karma.rep.alignment.LabeledLink;
import edu.isi.karma.rep.alignment.LinkKeyInfo;
import edu.isi.karma.rep.alignment.LinkStatus;
import edu.isi.karma.rep.alignment.LinkType;
import edu.isi.karma.rep.alignment.LiteralNode;
import edu.isi.karma.rep.alignment.Node;
import edu.isi.karma.rep.alignment.NodeType;
import edu.isi.karma.rep.alignment.ObjectPropertyLink;
import edu.isi.karma.rep.alignment.ObjectPropertySpecializationLink;
import edu.isi.karma.rep.alignment.ObjectPropertyType;
import edu.isi.karma.rep.alignment.SemanticType;
import edu.isi.karma.rep.alignment.SemanticType.Origin;
import edu.isi.karma.rep.alignment.SubClassLink;

public class GraphUtil {

  private static Logger logger = LoggerFactory.getLogger(GraphUtil.class);

  public static DirectedGraph<Node, DefaultLink> asDirectedGraph(UndirectedGraph<Node, DefaultLink> undirectedGraph) {
   
    if (undirectedGraph == null) {
      logger.debug("graph is null.");
      return null;
    }   

    DirectedGraph<Node, DefaultLink> g = new DirectedWeightedMultigraph<Node, DefaultLink>(DefaultLink.class);
   
    for (Node v : undirectedGraph.vertexSet())
      g.addVertex(v);
   
    for (DefaultLink e: undirectedGraph.edgeSet())
      g.addEdge(e.getSource(), e.getTarget(), e);
   
    return g;
  }

 
  public static DirectedWeightedMultigraph<Node, DefaultLink> asDefaultGraph(DirectedWeightedMultigraph<Node, LabeledLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return null;
    }   

    DirectedWeightedMultigraph<Node, DefaultLink> g = new DirectedWeightedMultigraph<Node, DefaultLink>(DefaultLink.class);
   
    for (Node v : graph.vertexSet())
      g.addVertex(v);
   
    for (DefaultLink e: graph.edgeSet())
      g.addEdge(e.getSource(), e.getTarget(), e);
   
    return g;
  }
 
  public static DirectedWeightedMultigraph<Node, LabeledLink> asLabeledGraph(DirectedWeightedMultigraph<Node, DefaultLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return null;
    }   

    DirectedWeightedMultigraph<Node, LabeledLink> g = new DirectedWeightedMultigraph<Node, LabeledLink>(LabeledLink.class);
   
    for (Node v : graph.vertexSet())
      g.addVertex(v);
   
    for (DefaultLink e: graph.edgeSet())
      if (e instanceof LabeledLink)
        g.addEdge(e.getSource(), e.getTarget(), (LabeledLink)e);
   
    return g;
  }
 
  public static UndirectedGraph<Node, DefaultLink> asDefaultGraph(UndirectedGraph<Node, LabeledLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return null;
    }   

    UndirectedGraph<Node, DefaultLink> g = new WeightedMultigraph<Node, DefaultLink>(DefaultLink.class);
   
    for (Node v : graph.vertexSet())
      g.addVertex(v);
   
    for (DefaultLink e: graph.edgeSet())
      g.addEdge(e.getSource(), e.getTarget(), e);
   
    return g;
  }
 
  public static WeightedMultigraph<Node, LabeledLink> asLabeledGraph(WeightedMultigraph<Node, DefaultLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return null;
    }   

    WeightedMultigraph<Node, LabeledLink> g = new WeightedMultigraph<Node, LabeledLink>(LabeledLink.class);
   
    for (Node v : graph.vertexSet())
      g.addVertex(v);
   
    for (DefaultLink e: graph.edgeSet())
      if (e instanceof LabeledLink)
        g.addEdge(e.getSource(), e.getTarget(), (LabeledLink)e);
   
    return g;
  }
 
  public static void printLabeledGraph(Graph<Node, LabeledLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return;
    }   
    StringBuffer sb = new StringBuffer();
    sb.append("*** Nodes ***\n");
    for (Node n : graph.vertexSet()) {
      sb.append(n.getLocalId());
      sb.append("\n");
        }
    sb.append("*** Links ***\n");
    for (DefaultLink link : graph.edgeSet()) {
      sb.append(link.getId());
      sb.append(", ");
      sb.append(link.getType().toString());
      sb.append(", ");
      sb.append(link.getWeight());
      sb.append("\n");
        }
//    sb.append("------------------------------------------");
    logger.debug(sb.toString());
  }
 
  public static void printGraph(Graph<Node, DefaultLink> graph) {
   
    if (graph == null) {
      logger.debug("graph is null.");
      return;
    }   
    StringBuffer sb = new StringBuffer();
    sb.append("*** Nodes ***\n");
    for (Node n : graph.vertexSet()) {
      sb.append(n.getLocalId());
      sb.append("\n");
        }
    sb.append("*** Links ***\n");
    for (DefaultLink link : graph.edgeSet()) {
      sb.append(link.getId());
      sb.append(", ");
      sb.append(link.getType().toString());
      sb.append(", ");
      sb.append(link.getWeight());
      sb.append("\n");
        }
//    sb.append("------------------------------------------");
    logger.debug(sb.toString());
  }
 
  public static String defaultGraphToString(Graph<Node, DefaultLink> graph) {
   
    if (graph == null) {
      logger.debug("The input graph is null.");
      return "";
    }   

    StringBuffer sb = new StringBuffer();   
    sb.append("*** Nodes ***\n");
    for (Node n : graph.vertexSet()) {
      sb.append(n.getLocalId());
      sb.append("\n");
        }
    sb.append("*** Links ***\n");
    for (DefaultLink edge : graph.edgeSet()) {
      sb.append("(");
      sb.append(edge.getId());
      sb.append(" - w=" + edge.getWeight());
      sb.append("\n");
        }
    //sb.append("------------------------------------------");
    return sb.toString();
   
  }
 
  public static String labeledGraphToString(Graph<Node, LabeledLink> graph) {
   
    if (graph == null) {
      logger.debug("The input graph is null.");
      return "";
    }   

    StringBuffer sb = new StringBuffer();
    sb.append("*** Nodes ***\n");
    for (Node n : graph.vertexSet()) {
      sb.append(n.getLocalId());
      sb.append("\n");
        }
    sb.append("*** Links ***\n");
    for (LabeledLink edge : graph.edgeSet()) {
      sb.append("(");
      sb.append(edge.getId());
      sb.append(" - status=" + edge.getStatus().name());
      sb.append(" - w=" + edge.getWeight());
      sb.append(" - type=" + edge.getType().name());
      sb.append("\n");
        }
    //sb.append("------------------------------------------");
    return sb.toString();
   
  }
 
  public static List<GraphPath> getPaths(DirectedGraph<Node, DefaultLink> g, int length) {
   
    List<GraphPath> graphPaths =
        new LinkedList<GraphPath>();

    if (g == null)
      return graphPaths;

    for (Node n : g.vertexSet()) {
      List<GraphPath> gpList = getOutgoingPaths(g, n, length);
      if (gpList != null) graphPaths.addAll(gpList);
    }

    return graphPaths;
   
  }
 
  public static List<GraphPath> getOutgoingPaths(DirectedGraph<Node, DefaultLink> g, Node n, int length) {
   
    List<GraphPath> graphPaths =
        new LinkedList<GraphPath>();

    if (g == null || n == null || length <= 0 || !g.vertexSet().contains(n))
      return graphPaths;
   
    Set<DefaultLink> outgoingLinks =  g.outgoingEdgesOf(n);
    if (outgoingLinks == null || outgoingLinks.isEmpty())
      return graphPaths;
   
    for (DefaultLink l : outgoingLinks) {
      List<GraphPath> nextGraphPaths = getOutgoingPaths(g, l.getTarget(), length - 1);
      if (nextGraphPaths == null || nextGraphPaths.isEmpty()) {
        GraphPath gp = new GraphPath();
        gp.addLink(l);
        if (gp.getLength() == length)
          graphPaths.add(gp);
      } else {
        for (GraphPath p : nextGraphPaths) {
          GraphPath gp = new GraphPath(p);
          gp.addLinkToHead(l);
          if (gp.getLength() == length)
            graphPaths.add(gp);
        }
      }
    }
   
    return graphPaths;
   
  }
 
  public static Set<Node> getOutNeighbors(DirectedGraph<Node, DefaultLink> g, Node n) {
   
    Set<Node> neighbors = new HashSet<Node>();
    if (g == null || n == null || !g.vertexSet().contains(n))
      return neighbors;
   
   
    Set<DefaultLink> outgoingLinks = g.outgoingEdgesOf(n);
    if (outgoingLinks != null) {
      for (DefaultLink l : outgoingLinks) {
        neighbors.add(l.getTarget());
      }
    }
   
    return neighbors;
  }

  public static Set<Node> getInNeighbors(DirectedGraph<Node, DefaultLink> g, Node n) {
   
    Set<Node> neighbors = new HashSet<Node>();
    if (g == null || n == null || !g.vertexSet().contains(n))
      return neighbors;
   
    Set<DefaultLink> incomingLinks = g.incomingEdgesOf(n);
    if (incomingLinks != null) {
      for (DefaultLink l : incomingLinks) {
        neighbors.add(l.getSource());
      }
    }
   
    return neighbors;
  }
 
  public static DisplayModel getDisplayModel(DirectedWeightedMultigraph<Node, LabeledLink> g, HTable hTable) {
    DisplayModel displayModel = new DisplayModel(g, hTable);
    return displayModel;
  }

  public static void treeToRootedTree(
      DirectedWeightedMultigraph<Node, DefaultLink> tree,
      Node node, LabeledLink e,
      Set<Node> visitedNodes,
      Set<String> reversedLinks,
      Set<String> removedLinks) {
   
    if (node == null)
      return;
   
    if (visitedNodes.contains(node)) // prevent having loop in the tree
      return;
   
    visitedNodes.add(node);
   
    Node source, target;
   
    Set<DefaultLink> incomingLinks = tree.incomingEdgesOf(node);
    if (incomingLinks != null) {
      LabeledLink[] incomingLinksArr = incomingLinks.toArray(new LabeledLink[0]);
      for (LabeledLink inLink : incomingLinksArr) {
       
        source = inLink.getSource();
        target = inLink.getTarget();
       
        // don't remove the incoming link from parent to this node
        if (e != null && inLink.equals(e))
          continue;
       
        // removeEdge method should always be called before addEdge because the new edge has the same id
        // and JGraph does not add the duplicate link
//        Label label = new Label(inLink.getLabel().getUri(), inLink.getLabel().getNs(), inLink.getLabel().getPrefix());
        LabeledLink reverseLink = inLink.clone(); //new Link(inLink.getId(), label);
        tree.removeEdge(inLink);
        tree.addEdge(target, source, reverseLink);
        tree.setEdgeWeight(reverseLink, inLink.getWeight());
       
        // Save the reversed links information
        reversedLinks.add(inLink.getId());
      }
    }

    Set<DefaultLink> outgoingLinks = tree.outgoingEdgesOf(node);

    if (outgoingLinks == null)
      return;
   
   
    LabeledLink[] outgoingLinksArr = outgoingLinks.toArray(new LabeledLink[0]);
    for (LabeledLink outLink : outgoingLinksArr) {
      target = outLink.getTarget();
      if (visitedNodes.contains(target)) {
        tree.removeEdge(outLink);
        removedLinks.add(outLink.getId());
      } else {
        treeToRootedTree(tree, target, outLink, visitedNodes, reversedLinks, removedLinks);
      }
    }
  }
 
//  public static void exportJson(Workspace workspace, Worksheet worksheet, DirectedWeightedMultigraph<Node, DefaultLink> graph, String filename) throws IOException {
  public static void exportJson(DirectedWeightedMultigraph<Node, DefaultLink> graph, String filename) throws IOException {
    logger.info("exporting the graph to json ...");
    File file = new File(filename);
    if (!file.exists()) {
      file.createNewFile();
    }

    FileOutputStream out = new FileOutputStream(file);
    JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
    //writer.setIndent("    ");
    try {
      writeGraph(graph, writer);
//      writeGraph(workspace, worksheet, graph, writer);
    } catch (Exception e) {
      logger.error("error in writing the model in json!");
        e.printStackTrace();
       } finally {
      writer.close();
    }
    logger.info("export is done.");
  }
 
  public static DirectedWeightedMultigraph<Node, DefaultLink> importJson(String filename) throws IOException {

    File file = new File(filename);
    if (!file.exists()) {
      logger.error("cannot open the file " + filename);
    }
   
    FileInputStream in = new FileInputStream(file);
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
      try {
        return readGraph(reader);
      } catch (Exception e) {
        logger.error("error in reading the model from json!");
        e.printStackTrace();
        return null;
      } finally {
        reader.close();
      }
  }
 
//  public static void writeGraph(Workspace workspace, Worksheet worksheet, DirectedWeightedMultigraph<Node, DefaultLink> graph, JsonWriter writer) throws IOException {
  public static void writeGraph(DirectedWeightedMultigraph<Node, DefaultLink> graph, JsonWriter writer) throws IOException {
   
    writer.beginObject();

    writer.name("nodes");
    writer.beginArray();
    if (graph != null)
      for (Node n : graph.vertexSet())
        writeNode(writer, n);
//        writeNode(workspace, worksheet, writer, n);
    writer.endArray();
   
    writer.name("links");
    writer.beginArray();
    if (graph != null)
      for (DefaultLink l : graph.edgeSet())
        writeLink(writer, l);
    writer.endArray();
   
    writer.endObject();
   
  }
 
//  private static void writeNode(Workspace workspace, Worksheet worksheet, JsonWriter writer, Node node) throws IOException {
  private static void writeNode(JsonWriter writer, Node node) throws IOException {
   
    if (node == null)
      return;
   
    String nullStr = null;
   
    writer.beginObject();
    writer.name("id").value(node.getId());
    writer.name("label");
    if (node.getLabel() == null) writer.value(nullStr);
    else writeLabel(writer, node.getLabel());
   
    writer.name("type").value(node.getType().toString());
//    SemanticTypeUtil semUtil = new SemanticTypeUtil();
    if (node instanceof ColumnNode) {
      ColumnNode cn = (ColumnNode) node;
      writer.name("hNodeId").value(cn.getHNodeId());
      writer.name("columnName").value(cn.getColumnName());
      writer.name("rdfLiteralType");
      if (cn.getRdfLiteralType() == null) writer.value(nullStr);
      else writeLabel(writer, cn.getRdfLiteralType());
      writer.name("userSelectedSemanticType");
      if (cn.getUserSelectedSemanticType() == null) writer.value(nullStr);
      else writeSemanticType(writer, cn.getUserSelectedSemanticType());
      writer.name("suggestedSemanticTypes");
      if (cn.getSuggestedSemanticTypes() == null) writer.value(nullStr);
//      ArrayList<SemanticType> semTypes = null;
//      semTypes = semUtil.getColumnSemanticSuggestions(workspace, worksheet, cn, 4);
//      if (semTypes == null) writer.value(nullStr);
      else {
        writer.beginArray();
        for (SemanticType semanticType : cn.getSuggestedSemanticTypes())
          writeSemanticType(writer, semanticType);
        writer.endArray();
      }
    }
    if (node instanceof LiteralNode) {
      LiteralNode ln = (LiteralNode) node;
      writer.name("value").value(ln.getValue());
      writer.name("datatype");
      if (ln.getDatatype() == null) writer.value(nullStr);
      else writeLabel(writer, ln.getDatatype());
      writer.name("isUri").value(Boolean.toString(ln.isUri()));
    }
   
    writer.name("modelIds");
    if (node.getModelIds() == null) writer.value(nullStr);
    else writeModelIds(writer, node.getModelIds());
    writer.endObject();
  }

  private static void writeLink(JsonWriter writer, DefaultLink link) throws IOException {
   
    if (link == null)
      return;
   
    String nullStr = null;

    writer.beginObject();
    writer.name("id").value(link.getId());
    writer.name("weight").value(link.getWeight());
    writer.name("type").value(link.getType().toString());
    if (link instanceof CompactObjectPropertyLink)
      writer.name("objectPropertyType").value( ((CompactObjectPropertyLink)link).getObjectPropertyType().toString());
    else if (link instanceof LabeledLink) {
      LabeledLink l = (LabeledLink)link;
      writer.name("label");
      if (l.getLabel() == null) writer.value(nullStr);
      else writeLabel(writer, l.getLabel());
      if (l instanceof DataPropertyOfColumnLink)
        writer.name("hNodeId").value( ((DataPropertyOfColumnLink)l).getSpecializedColumnHNodeId());
      if (l instanceof ObjectPropertyLink)
        writer.name("objectPropertyType").value( ((ObjectPropertyLink)l).getObjectPropertyType().toString());
      if (l instanceof ObjectPropertySpecializationLink) {
        writer.name("specializedLink").value(((ObjectPropertySpecializationLink)l).getSpecializedLinkId());
      }
      writer.name("status").value(l.getStatus().toString());
      writer.name("keyInfo").value(l.getKeyType().toString());
      writer.name("modelIds");
      writeModelIds(writer, l.getModelIds());
    }
    writer.endObject();
  }
 
  private static void writeLabel(JsonWriter writer, Label label) throws IOException {
   
    if (label == null)
      return;
   
    writer.beginObject();
    writer.name("uri").value(label.getUri());
//    writer.name("ns").value(label.getNs());
//    writer.name("prefix").value(label.getPrefix());
//    writer.name("rdfsLabel").value(label.getRdfsLabel());
//    writer.name("rdfsComment").value(label.getRdfsComment());
    writer.endObject();
  }
 
  private static void writeSemanticType(JsonWriter writer, SemanticType semanticType) throws IOException {
   
    if (semanticType == null)
      return;
   
    String nullStr = null;
   
    writer.beginObject();
    writer.name("hNodeId").value(semanticType.getHNodeId());
    writer.name("domain");
    if (semanticType.getDomain() == null) writer.value(nullStr);
    else writeLabel(writer, semanticType.getDomain());
    writer.name("type");
    if (semanticType.getType() == null) writer.value(nullStr);
    else writeLabel(writer, semanticType.getType());
    writer.name("origin").value(semanticType.getOrigin().toString());
    writer.name("confidenceScore").value(semanticType.getConfidenceScore());
    writer.endObject();
  }
 
  private static void writeModelIds(JsonWriter writer, Set<String> modelIds) throws IOException {
   
    if (modelIds == null)
      return;
   
    writer.beginArray();
    for (String s : modelIds)
      writer.value(s);
    writer.endArray();
  }
 
  public static DirectedWeightedMultigraph<Node, DefaultLink> readGraph(JsonReader reader) throws IOException {
   
    DirectedWeightedMultigraph<Node, DefaultLink> graph =
        new DirectedWeightedMultigraph<Node, DefaultLink>(LabeledLink.class);
   
    Node n, source, target;
    DefaultLink l;
    Double[] weight = new Double[1];
    HashMap<String, Node> idToNodes = new HashMap<String, Node>();
   
    reader.beginObject();
      while (reader.hasNext()) {
        String key = reader.nextName();
      if (key.equals("nodes") && reader.peek() != JsonToken.NULL) {
        reader.beginArray();
          while (reader.hasNext()) {
            n = readNode(reader);
            if (n != null) {
              idToNodes.put(n.getId(), n);
              graph.addVertex(n);
            }
          }
          reader.endArray();
      } else if (key.equals("links") && reader.peek() != JsonToken.NULL) {
        reader.beginArray();
          while (reader.hasNext()) {
            l = readLink(reader, weight);
            if (l != null) {
              source = idToNodes.get(LinkIdFactory.getLinkSourceId(l.getId()));
              target = idToNodes.get(LinkIdFactory.getLinkTargetId(l.getId()));
              if (source  != null && target != null) {
                graph.addEdge(source, target, l);
                if (weight[0] != null) graph.setEdgeWeight(l, weight[0].doubleValue());
              }
            }
          }
          reader.endArray();     
      } else {
        reader.skipValue();
      }
    }
      reader.endObject();
     
    return graph;
  }

  private static Node readNode(JsonReader reader) throws IOException {
   
    String id = null;
    Label label = null;
    NodeType type = null;
    String hNodeId = null;
    String columnName = null;
    Label rdfLiteralType = null;
    Label datatype = null;
    String value = null;
    boolean isUri = false;
    SemanticType userSelectedSemanticType = null;
    List<SemanticType> suggestedSemanticTypes = null;
    Set<String> modelIds = null;
   
    reader.beginObject();
      while (reader.hasNext()) {
        String key = reader.nextName();
      if (key.equals("id") && reader.peek() != JsonToken.NULL) {
        id = reader.nextString();
      } else if (key.equals("label") && reader.peek() != JsonToken.NULL) {
        label = readLabel(reader);
      } else if (key.equals("type") && reader.peek() != JsonToken.NULL) {
        type = NodeType.valueOf(reader.nextString());
      } else if (key.equals("hNodeId") && reader.peek() != JsonToken.NULL) {
        hNodeId = reader.nextString();
      } else if (key.equals("columnName") && reader.peek() != JsonToken.NULL) {
        columnName = reader.nextString();
      } else if (key.equals("datatype") && reader.peek() != JsonToken.NULL) {
        datatype = readLabel(reader);
      } else if (key.equals("value") && reader.peek() != JsonToken.NULL) {
        value = reader.nextString();
      } else if (key.equals("isUri") && reader.peek() != JsonToken.NULL) {
        isUri = Boolean.parseBoolean(reader.nextString());
      } else if (key.equals("rdfLiteralType") && reader.peek() != JsonToken.NULL) {
        rdfLiteralType = readLabel(reader);
      } else if (key.equals("userSelectedSemanticType") && reader.peek() != JsonToken.NULL) {
        userSelectedSemanticType = readSemanticType(reader);
      } else if (key.equals("suggestedSemanticTypes") && reader.peek() != JsonToken.NULL) {
        suggestedSemanticTypes = new ArrayList<SemanticType>();
        reader.beginArray();
          while (reader.hasNext()) {
            SemanticType semanticType = readSemanticType(reader);
            suggestedSemanticTypes.add(semanticType);
        }
          reader.endArray();       
      } else if (key.equals("modelIds") && reader.peek() != JsonToken.NULL) {
        modelIds = readModelIds(reader);
      } else {
        reader.skipValue();
      }
    }
      reader.endObject();
     
      Node n = null;
      if (type == NodeType.InternalNode) {
        n = new InternalNode(id, label);
      } else if (type == NodeType.ColumnNode) {
        n = new ColumnNode(id, hNodeId, columnName, rdfLiteralType);
        ((ColumnNode)n).setUserSelectedSemanticType(userSelectedSemanticType);
        ((ColumnNode)n).setSuggestedSemanticTypes(suggestedSemanticTypes);
      } else if (type == NodeType.LiteralNode) {
        n = new LiteralNode(id, value, datatype, isUri);
      } else {
        logger.error("cannot instanciate a node from the type: " + type.toString());
        return null;
      }
     
    n.setModelIds(modelIds);
     
      return n;
  }
 
  private static DefaultLink readLink(JsonReader reader, Double[] weight) throws IOException {
   
    String id = null;
    Label label = null;
    LinkType type = null;
    String hNodeId = null;
    ObjectPropertyType objectPropertyType = null;
    String specializedLinkId = null;
    LinkStatus status = null;
    LinkKeyInfo keyInfo = null;
    Set<String> modelIds = null;
    if (weight == null) weight = new Double[1];

    reader.beginObject();
      while (reader.hasNext()) {
        String key = reader.nextName();
      if (key.equals("id") && reader.peek() != JsonToken.NULL) {
        id = reader.nextString();
      } else if (key.equals("label") && reader.peek() != JsonToken.NULL) {
        label = readLabel(reader);
      } else if (key.equals("type") && reader.peek() != JsonToken.NULL) {
        type = LinkType.valueOf(reader.nextString());
      } else if (key.equals("hNodeId") && reader.peek() != JsonToken.NULL) {
        hNodeId = reader.nextString();
      } else if (key.equals("objectPropertyType") && reader.peek() != JsonToken.NULL) {
        objectPropertyType = ObjectPropertyType.valueOf(reader.nextString());
      } else if (key.equals("specializedLinkId") && reader.peek() != JsonToken.NULL) {
        specializedLinkId = reader.nextString();
      } else if (key.equals("status") && reader.peek() != JsonToken.NULL) {
        status = LinkStatus.valueOf(reader.nextString());
      } else if (key.equals("keyInfo") && reader.peek() != JsonToken.NULL) {
        keyInfo = LinkKeyInfo.valueOf(reader.nextString());
      } else if (key.equals("modelIds") && reader.peek() != JsonToken.NULL) {
        modelIds = readModelIds(reader);
      } else if (key.equals("weight") && reader.peek() != JsonToken.NULL) {
        weight[0] = new Double(reader.nextDouble());
      } else {
        reader.skipValue();
      }
    }
      reader.endObject();
     
      DefaultLink l = null;
      if (type == LinkType.ClassInstanceLink) {
        l = new ClassInstanceLink(id, keyInfo);
      } else if (type == LinkType.ColumnSubClassLink) {
        l = new ColumnSubClassLink(id);
      } else if (type == LinkType.DataPropertyLink) {
        l = new DataPropertyLink(id, label);
      } else if (type == LinkType.DataPropertyOfColumnLink) {
        l = new DataPropertyOfColumnLink(id, hNodeId, specializedLinkId);
      } else if (type == LinkType.ObjectPropertyLink) {
        l = new ObjectPropertyLink(id, label, objectPropertyType);
      } else if (type == LinkType.ObjectPropertySpecializationLink) {
        l = new ObjectPropertySpecializationLink(hNodeId, specializedLinkId);
      } else if (type == LinkType.SubClassLink) {
        l = new SubClassLink(id);
      } else if (type == LinkType.CompactObjectPropertyLink) {
        l = new CompactObjectPropertyLink(id, objectPropertyType);
      } else if (type == LinkType.CompactSubClassLink) {
        l = new CompactSubClassLink(id);
      } else {
        logger.error("cannot instanciate a link from the type: " + type.toString());
        return null;
      }
     
      if (l instanceof LabeledLink) {
        ((LabeledLink)l).setStatus(status);
        ((LabeledLink)l).setModelIds(modelIds);
      }
      return l;
  }
 
  private static Label readLabel(JsonReader reader) throws IOException {
   
    String uri = null;
//    String ns = null;
//    String prefix = null;
//    String rdfsComment = null;
//    String rdfsLabel = null;
   
    reader.beginObject();
      while (reader.hasNext()) {
        String key = reader.nextName();
      if (key.equals("uri") && reader.peek() != JsonToken.NULL) {
        uri = reader.nextString();
//      } else if (key.equals("ns") && reader.peek() != JsonToken.NULL) {
//        ns = reader.nextString();
//      } else if (key.equals("prefix") && reader.peek() != JsonToken.NULL) {
//        prefix = reader.nextString();
//      } else if (key.equals("rdfsLabel") && reader.peek() != JsonToken.NULL) {
//        rdfsLabel = reader.nextString();
//      } else if (key.equals("rdfsComment") && reader.peek() != JsonToken.NULL) {
//        rdfsComment = reader.nextString();
      } else {
        reader.skipValue();
      }
    }
      reader.endObject();
     
//      Label label = new Label(uri, ns, prefix, rdfsLabel, rdfsComment);
      Label label = new Label(uri);
      return label;
  }
 
  private static SemanticType readSemanticType(JsonReader reader) throws IOException {

    String hNodeId = null;
    Label domain = null;
    Label type = null;
    Origin origin = null;
    Double confidenceScore = null;
   
    reader.beginObject();
      while (reader.hasNext()) {
        String key = reader.nextName();
      if (key.equals("hNodeId") && reader.peek() != JsonToken.NULL) {
        hNodeId = reader.nextString();
      } else if (key.equals("domain") && reader.peek() != JsonToken.NULL) {
        domain = readLabel(reader);
      } else if (key.equals("type") && reader.peek() != JsonToken.NULL) {
        type = readLabel(reader);
      } else if (key.equals("origin") && reader.peek() != JsonToken.NULL) {
        origin = Origin.valueOf(reader.nextString());
      } else if (key.equals("confidenceScore") && reader.peek() != JsonToken.NULL) {
        confidenceScore = reader.nextDouble();
      } else {
        reader.skipValue();
      }
    }
      reader.endObject();
     
      SemanticType semanticType = new SemanticType(hNodeId, type, domain, origin, confidenceScore);
      return semanticType; 
    }
 
  private static Set<String> readModelIds(JsonReader reader) throws IOException {
   
    Set<String> modelIds = new HashSet<String>();
   
    reader.beginArray();
      while (reader.hasNext()) {
        modelIds.add(reader.nextString());
    }
      reader.endArray();
     
      return modelIds;
  }
}
TOP

Related Classes of edu.isi.karma.modeling.alignment.GraphUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.