private void updateSchema(
      String relationName,
      PrintWriter log,
      Node left,
      Node right,
      String nodename1,
      String nodename2) {
    Pair<String, String> p =
        left.getName().hashCode() > right.getName().hashCode()
            ? new Pair<String, String>(left.getName(), right.getName())
            : new Pair<String, String>(right.getName(), left.getName());

    ConcurrentHashMap<Pair<String, String>, Boolean> explored = uniquePairs_.get(relationName);
    if (explored.containsKey(p)) return;

    String outStr;
    if (!left.equals(right)) {
      if (isAlreadyDisjointed(left, right)) {
        updateReliabilityCount(relationName, left, right, 0);
        outStr =
            relationName
                + ": "
                + left.getName()
                + " known disjoint to "
                + right.getName()
                + ": "
                + nodename1
                + ","
                + nodename2;
      } else if (hasConjoint(left, right)) {
        updateReliabilityCount(relationName, left, right, 1);
        outStr =
            relationName
                + ": "
                + left.getName()
                + " known conjoint to "
                + right.getName()
                + ": "
                + nodename1
                + ","
                + nodename2;
      } else {
        updateReliabilityCount(relationName, left, right, 2);
        outStr =
            relationName
                + ": "
                + left.getName()
                + " unknown to "
                + right.getName()
                + ": "
                + nodename1
                + ","
                + nodename2;
      }
      // System.out.println(outStr);
      log.println(outStr);
    }
    explored.put(p, true);
  }
  private boolean isTangible(Node node) {
    // exclude itself
    if (node.equals(partiallyTangible)) return false;

    return queryModule_.prove(false, genls, node, partiallyTangible) == QueryResult.TRUE;
  }