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 }