package org.wikibrain.spatial.matcher; import com.typesafe.config.Config; import com.vividsolutions.jts.geom.Geometry; import org.wikibrain.conf.ConfigurationException; import org.wikibrain.core.WikiBrainException; import org.wikibrain.core.cmd.Env; import org.wikibrain.core.dao.DaoException; import org.wikibrain.core.lang.Language; import org.wikibrain.core.lang.LocalId; import org.wikibrain.wikidata.*; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Shilad Sen */ public class WikidataValueScorer extends AbstractMatchScorer { private static final Logger LOG = LoggerFactory.getLogger(WikidataValueScorer.class); private WikidataDao wikidataDao; private int propertyId; private String columnName; public WikidataValueScorer(Env env, Config conf) throws ConfigurationException { super(env, conf); try { wikidataDao = env.getConfigurator().get(WikidataDao.class); columnName = conf.getString("column"); Language lang = env.getLanguages().getBestAvailableEnglishLang(false); WikidataEntity prop = wikidataDao.getProperty(lang, conf.getString("property")); if (prop == null) { throw new IllegalArgumentException("Couldn't find property with name " + conf.getString("property")); } propertyId = prop.getId(); } catch (WikiBrainException e) { throw new ConfigurationException(e); } catch (DaoException e) { throw new ConfigurationException(e); } } @Override public double score(LocalId candidate, Map<String, String> row, Geometry geometry) throws DaoException { if (!row.containsKey(columnName)) { throw new IllegalArgumentException("No column with name " + columnName + " in dbx"); } String rowValue = row.get(columnName).toString(); for (WikidataStatement st : wikidataDao.getStatements(candidate.asLocalPage())) { if (st.getProperty() == null || st.getProperty().getId() != propertyId) { continue; } String candidateVal = null; if (st.getValue().getType() == WikidataValue.Type.ITEM) { candidateVal = String.valueOf(st.getValue().getItemValue()); } else if (st.getValue().getType() == WikidataValue.Type.INT) { candidateVal = String.valueOf(st.getValue().getIntValue()); } else if (st.getValue().getType() == WikidataValue.Type.STRING) { candidateVal = st.getValue().getStringValue(); } else { LOG.warn("Unexpected type for property " + st.getProperty() + ": " + st.getValue()); } if (candidateVal != null && candidateVal.equalsIgnoreCase(rowValue)) { return 1.0; } } return 0.0; } }