package edu.stanford.nlp.sempre.freebase; import fig.basic.IOUtils; import fig.basic.LogInfo; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; public final class Utils { private Utils() { } public static final String ttlPrefix = "@prefix fb: <http://rdf.freebase.com/ns/>."; // Somewhat of a crude approximation. public static boolean isUrl(String s) { return s.startsWith("<"); } // Virtuoso can't deal with this; these are probably useless anyway. public static boolean identifierContainsStrangeCharacters(String s) { return !s.startsWith("\"") && s.contains("$"); } // Convert a string from the ns: namespace to the fb: namespace. // "ns:en.barack_obama" => "fb:en.barack_obama" public static String nsToFb(String s) { if (s.startsWith("ns:")) return "fb:" + s.substring(3); return s; } // "\"/en/distributive_writing\"" => "fb:en.distributive_writing" public static String stringToRdf(String arg2) { if (!arg2.startsWith("\"/") || !arg2.endsWith("\"")) throw new RuntimeException("Bad: " + arg2); return "fb:" + arg2.substring(2, arg2.length() - 1).replaceAll("/", "."); } public static String[] parseTriple(String line) { if (!line.endsWith(".")) return null; String[] tokens = line.substring(0, line.length() - 1).split("\t"); if (tokens.length != 3) return null; tokens[0] = Utils.nsToFb(tokens[0]); tokens[1] = Utils.nsToFb(tokens[1]); tokens[2] = Utils.nsToFb(tokens[2]); return tokens; } public static int parseInt(String arg2) { if (!arg2.endsWith("^^xsd:int")) throw new RuntimeException("Arg2 is not a valid integer: " + arg2); int closingQuoteIndex = arg2.lastIndexOf('"'); return Integer.parseInt(arg2.substring(1, closingQuoteIndex)); } public static String parseStr(String arg2) { if (!arg2.endsWith("@en")) throw new RuntimeException("Arg2 is not a valid String: " + arg2); int closingQuoteIndex = arg2.lastIndexOf('"'); return arg2.substring(1, closingQuoteIndex); } public static void writeTriple(PrintWriter out, String arg1, String property, String arg2) { out.println(arg1 + "\t" + property + "\t" + arg2 + "."); } // For some reason, the Freebase topic dumps don't have properly formatted numbers. // We need to replace // fb:m.012_53 fb:people.person.height_meters 1.57. // with // fb:m.012_53 fb:people.person.height_meters "1.57"^^xsd:double. // This function operates on the second argument (value). public static String quoteValues(String value) { if (value.equals("true")) return "\"true\"^^xsd:boolean"; if (value.equals("false")) return "\"false\"^^xsd:boolean"; // Short circuit: not numeric if (value.startsWith("\"") || (value.length() > 0 && Character.isLetter(value.charAt(0)))) return value; // Try to convert to integer try { Integer.parseInt(value); return "\"" + value + "\"^^xsd:int"; } catch (NumberFormatException e) { } // Try to convert to double try { Double.parseDouble(value); return "\"" + value + "\"^^xsd:double"; } catch (NumberFormatException e) { } return value; } public static Map<String, String> readCanonicalIdMap(String canonicalIdMapPath) { return readCanonicalIdMap(canonicalIdMapPath, Integer.MAX_VALUE); } public static Map<String, String> readCanonicalIdMap(String canonicalIdMapPath, int maxInputLines) { Map<String, String> canonicalIdMap = new HashMap<String, String>(); LogInfo.begin_track("Read %s", canonicalIdMapPath); try { BufferedReader in = IOUtils.openIn(canonicalIdMapPath); String line; int numInputLines = 0; while (numInputLines < maxInputLines && (line = in.readLine()) != null) { numInputLines++; if (numInputLines % 10000000 == 0) LogInfo.logs("Read %s lines", numInputLines); String[] tokens = line.split("\t"); if (tokens.length != 2) throw new RuntimeException("Bad format: " + line); canonicalIdMap.put(tokens[0], tokens[1]); } in.close(); } catch (IOException e) { throw new RuntimeException(e); } LogInfo.end_track(); return canonicalIdMap; } }