java - 远程端点上的自定义 jena 过滤器功能?

标签 java sparql jena similarity dbpedia

首先,如你所知,我没有很长的计算机科学背景,今年开始使用网络语义,所以我已经为我可以使用的任何不精确/非科学术语/糟糕的编码风格道歉在这个问题上。

这是我的任务: 我想找到与我之前从某些文档中提取的某些标签最接近的 dbpedia 资源。为此,我使用自定义过滤器函数(例如,进行 Dice 系数计算,返回 0 到 1 之间的分数)来计算 DBpedia 标签和提取的表达式之间的相似性(我使用的是 Jena Apache)。

Ex1:提取:“bea systems”-> 最近的 DBpedia 标签:“BAE Systems Inc.”等

Ex2:提取:“harper-collins publishing company” -> 最近的 DBpedia 标签:“Harper-Collins”、“HarperCollins” 、“HarperCollins Publishers”等

我的问题是我需要在 DBpdia 端点上执行查询,因为数据集很大(内存问题),但是我收到了一条 http 500 错误消息,因为我的函数存储在本地并且我正在查询远程访问端点...

Exception in thread "main" HttpException: 500
at com.hp.hpl.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:414)
at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execGet(HttpQuery.java:358)
at com.hp.hpl.jena.sparql.engine.http.HttpQuery.exec(HttpQuery.java:295)
at com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP.execSelect(QueryEngineHTTP.java:346)
at jena.example.similar.propfunction.DistanceTest.main(DistanceTest.java:48)

这是我的查询代码:

Node exp = NodeFactory.createLiteral("harper-collins publishing company") ;

String queryString = "" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
"PREFIX fn: <java:jena.example.similar.propfunction.> " +
"PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> " +
"SELECT  ?company ?label ?funcRes " +
"WHERE {" +
"?company a dbpedia-owl:Company . " +
"?company rdfs:label ?label . " +
"BIND (fn:DiceCoeff(?label, "+exp+") as ?funcRes) " +
"FILTER (lang(?label) = \"en\")" +
"}" +
"ORDER BY DESC(?funcRes) " +
"LIMIT 10 " ;

Query query = QueryFactory.create(queryString) ;

// execute the query
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
try {
    ResultSet results = qexec.execSelect() ;
    ResultSetFormatter.out(System.out, results, query) ;
} finally { qexec.close() ; }

我使用的过滤函数工作正常,我在本地访问的另一个较小的数据集(不是 DBpdia)上使用相同类型的查询(即使用 BIND 和 ORDER BY)测试了它,它给了我预期的结果.

那么,有没有办法在远程端点上使用或根本不使用自定义过滤器功能?否则,我正在做的任务还有哪些其他选择? (我已经阅读了 How I can write SPARQL query that uses similarity measures in Java Code 中的讨论,但它似乎对我来说不是最好的)

我将不胜感激社区的任何建议:)

最佳答案

自定义函数仅在本地注册并可用。除非远程服务也理解该函数,否则它不会对远程服务起作用,要么产生您看到的错误,要么返回自定义函数的未绑定(bind)值。

您可以尝试使用 SERVICE 子句将您的部分查询定向到 DBPedia 并在本地运行自定义过滤器功能。这可能不会很好地执行,但将允许您使用自定义过滤器功能,例如

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX fn: <java:jena.example.similar.propfunction.
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT  ?company ?label ?funcRes
WHERE 
{
  SERVICE <http://dbpedia.org/sparql>
  {
    ?company a dbpedia-owl:Company . 
    ?company rdfs:label ?label .
    FILTER (lang(?x) = "en")
  }
  BIND (fn:DiceCoeff(?x, "exp") as ?funcRes)
}
ORDER BY DESC(?funcRes)
LIMIT 10

这个查询可以在本地运行,它首先远程查询DBPedia找到公司列表,然后在本地计算自定义函数,最后使用计算值进行排序。

然后您需要修改代码,以便针对本地数据集运行查询,例如

QueryExecution qexec = QueryExecutionFactory.create(query, DatasetFactory.createMem());

如果这对您来说性能不够好,另一种选择是下载 DBPedia 数据转储并加载到本地 TDB 数据库中,这样您就可以完全在本地运行查询。参见 Load DBpedia locally using Jena TDB?有关如何执行此操作的一些信息。

关于java - 远程端点上的自定义 jena 过滤器功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884731/

相关文章:

java - Yield/Join 释放监视器是否锁定?

java - JLabel 设置为文本列表项

java - Android 游戏上的自动保存和自动加载游戏概念以及内部保存与保存。外部(又称 SD 卡)

java - 使用 SPARQL 构造查询部分 RDF 图

java - Stardog 自定义聚合函数在耶拿不可用

java - 使用WebMvcTest测试具有重复名称的 Controller

sparql - 为什么可选绑定(bind)不起作用

java - Jena Sparql 仅返回实例的直接父类(super class)

java - 禁用 apache.http.wire DEBUG 日志

java - jena 从 gzip 压缩文件中读取输入流