1 package eu.fbk.dkm.pikes.eval; 2 3 import java.util.Iterator; 4 import java.util.Map; 5 6 import javax.annotation.Nullable; 7 8 import com.google.common.collect.FluentIterable; 9 import com.google.common.collect.Maps; 10 import com.google.common.collect.Ordering; 11 12 import org.eclipse.rdf4j.model.Statement; 13 import org.eclipse.rdf4j.model.IRI; 14 import org.eclipse.rdf4j.model.Value; 15 import org.eclipse.rdf4j.query.BindingSet; 16 import org.eclipse.rdf4j.query.MalformedQueryException; 17 import org.eclipse.rdf4j.query.algebra.TupleExpr; 18 19 import eu.fbk.utils.eval.PrecisionRecall; 20 import eu.fbk.rdfpro.util.Algebra; 21 import eu.fbk.rdfpro.util.Namespaces; 22 import eu.fbk.rdfpro.util.QuadModel; 23 import eu.fbk.rdfpro.util.Statements; 24 25 final class Util { 26 27 public static final Ordering<Value> VALUE_ORDERING = Ordering.from( 28 Statements.valueComparator()).nullsLast(); 29 30 public static final Ordering<Statement> STMT_ORDERING = Ordering.from(Statements 31 .statementComparator("spoc", VALUE_ORDERING)); 32 33 public static final Namespaces NAMESPACES; 34 35 static { 36 final Map<String, String> map = Maps.newHashMap(Namespaces.DEFAULT.uriMap()); 37 map.put("pb", "http://pikes.fbk.eu/ontologies/propbank#"); 38 map.put("nb", "http://pikes.fbk.eu/ontologies/nombank#"); 39 map.put("vn", "http://pikes.fbk.eu/ontologies/verbnet#"); 40 map.put("fn", "http://pikes.fbk.eu/ontologies/framenet#"); 41 map.put("dul", "http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#"); 42 map.put("wni", "http://www.w3.org/2006/03/wn/wn30/instances/"); 43 map.put("fbox", "http://www.ontologydesignpatterns.org/ont/boxer/boxer.owl#"); 44 map.put("fpos", "http://www.ontologydesignpatterns.org/ont/fred/pos.owl#"); 45 map.put("fboxing", "http://www.ontologydesignpatterns.org/ont/boxer/boxing.owl#"); 46 map.put("d0", "http://www.ontologydesignpatterns.org/ont/d0.owl#"); 47 map.put("wn30", "http://wordnet-rdf.princeton.edu/wn30/"); 48 map.put("nwronto", "http://www.newsreader-project.eu/ontologies/"); 49 NAMESPACES = Namespaces.forURIMap(map); 50 } 51 52 public static TupleExpr parse(final String query) { 53 try { 54 return Algebra.parseQuery(query, null, Namespaces.DEFAULT.uriMap()).getTupleExpr(); 55 } catch (final MalformedQueryException ex) { 56 throw new IllegalArgumentException(ex); 57 } 58 } 59 60 public static FluentIterable<BindingSet> query(final QuadModel model, final TupleExpr query) { 61 return new FluentIterable<BindingSet>() { 62 63 @Override 64 public Iterator<BindingSet> iterator() { 65 return model.evaluate(query, null, null); 66 } 67 68 }; 69 } 70 71 public static String format(@Nullable final IRI baseIRI, final Object... objects) { 72 String result = ""; 73 for (final Object object : objects) { 74 String s = ""; 75 if (object instanceof Value) { 76 final Value value = (Value) object; 77 final boolean abbreviate = value instanceof IRI && baseIRI != null 78 && ((IRI) value).getNamespace().equals(baseIRI.stringValue()); 79 s = abbreviate ? ":" + ((IRI) value).getLocalName() : Statements.formatValue( 80 value, Util.NAMESPACES); 81 } else if (object instanceof Relation) { 82 s = ((Relation) object).toString(baseIRI); 83 } else if (object instanceof Statement) { 84 final Statement stmt = (Statement) object; 85 return format(baseIRI, stmt.getSubject()) + " " 86 + format(baseIRI, stmt.getPredicate()) + " " 87 + format(baseIRI, stmt.getObject()); 88 } else if (object instanceof PrecisionRecall) { 89 final PrecisionRecall pr = (PrecisionRecall) object; 90 return String.format("f1=%5.3f p=%5.3f r=%5.3f tp=%d fp=%d fn=%d", pr.getF1(), 91 pr.getPrecision(), pr.getRecall(), (int) pr.getTP(), (int) pr.getFP(), 92 (int) pr.getFN()); 93 } else if (object != null) { 94 s = object.toString(); 95 } 96 result = result.isEmpty() ? s : result + ", " + s; 97 } 98 return result; 99 } 100 101 }