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 }