【问题标题】:Generating urls for a sparql query which is using dbpedia为使用 dbpedia 的 sparql 查询生成 url
【发布时间】:2014-07-23 14:16:55
【问题描述】:

我正在为一项服务开发前端,目前,用户提出自己的 SPARQL 查询并在其中设置参数,例如:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX framenet: <http://www.newsreader-project.eu/framenet/>
PREFIX gaf: <http://groundedannotationframework.org/files/2014/01/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX sem: <http://semanticweb.cs.vu.nl/2009/11/sem/>
# All allowed parameters:
# output: html, offset: 0, limit: 100, 
# uri.0: {uri_0}, uri.1: {uri_1}
# filter_block: ?filterfield bif:contains "{string}" ., date_filter_block: ?d owltime:year "{datefilter}"^^xsd:int . 
# uri_filter_block:  ?filterfield rdfs:label ?_label . ?_label bif:contains "{string}" .

SELECT ?event (COUNT(*) AS ?event_size) ?datetime ?event_label
WHERE {
  {
    SELECT DISTINCT ?event ?datetime ?event_label
    WHERE {
      { ?event sem:hasActor {uri_0} } UNION { ?event sem:hasPlace {uri_0} }
      ?event sem:hasTime ?t ; rdfs:label ?event_label .
      ?t owltime:inDateTime ?d .
      ?d owltime:year "{datefilter}"^^xsd:int . 
      ?t rdfs:label ?datetimetmp .
      FILTER (regex(?datetimetmp,"\\d{4}-\\d{2}"))
      BIND (SUBSTR(?datetimetmp,1,10) AS ?datetime)
    }
    ORDER BY ?datetime
    OFFSET 0
    LIMIT 100
  }
  ?event ?p ?o .
}
GROUP BY ?event ?datetime ?event_label
ORDER BY ?datetime

然后生成一个类似this 的页面,将查询结果显示为表格。

我要做的是创建一个页面,用户可以使用该页面以“更简单”的方式输入所需的参数。因此,我没有在 SPARQL 查询中输入limit:100,而是为他们提供了一个名为“限制”的文本框,然后他们在其中输入一个值。我还有一个下拉列表,其中列出了所有不同的查询类型(例如我在这里向您展示的“获取提及指定演员的事件”,或其他诸如“获取类型的属性”或“获取事件一个特定的框架净值')。

我有一个 index.html 文件和一个 code.js 文件,到目前为止,我只有一个带有文本框和一个提交按钮的页面,当单击/输入时,一个函数会运行它使用 ajax 请求从我生成的 url 中“拉”表,例如我上面链接到的结果页面。这个url是通过以下方式生成的:

var runQuery = function move(actor, pageNum) {
    var initUrl = "https://newsreader.scraperwiki.com/{0}/page/{1}?uris.0={2}"
    var queryUrl = initUrl.replace("{1}", pageNum);
    var queryUrl = queryUrl.replace("{2}", "dbpedia:" + actor);
    limit = $(textInput[1]).val();
    offset = $(textInput[2]).val();
    stringFilter = $(textInput[3]).val();
    dateFilter = $(textInput[4]).val();
    framenet = $(textInput[5]).val();
    if (limit != "") {queryUrl += ("&limit=" + limit)};
    if (offset != "") {queryUrl += ("&offset=" + offset)};
    if (stringFilter != "") {queryUrl += ("&filter=" + stringFilter)};
    if (dateFilter != "") {queryUrl += ("&datefilter=" + dateFilter)};
    //...more code follows...

完整代码可以在here找到。

到目前为止,这一切都很好,但是我很难想出如何简洁地更改 var queryUrl = queryUrl.replace("{2}", "dbpedia:" + actor; 行以及其余代码以解释使用的不同前缀的方法对于不同的查询类型(在上面的 SPARQL 查询中,它是 PREFIX dbpedia: &lt;http...,但有时是 PREFIX dbo: &lt;http...,等等)。

在冗长的解释之后,我想知道是否有替代手动操作queryUrl 并使用大量条件语句来解释所有不同查询类型的方法,如果是,我该如何做吗?我对任何类型的网络东西都很陌生,我有点迷路了!关于如何尽可能简洁地处理不同查询类型的任何建议都会很棒。我现在能想到的唯一方法是编写某种代码,上面写着......

if (actor != "") {
    queryUrl = queryUrl.replace("{2}", "dbpedia:" + actor);
} else if (....) {
    queryUrl = queryUrl.replace("{2}", "dbo:" + ....);
} else... etc

..(演员指的是事物的名称),但我认为这样做会很笨拙,并且会与需要考虑的所有不同格式混淆。

提前致谢,如果需要有关我的问题的更多信息,请随时告诉我!

edit:我已经得出结论,dbpedia-spotlight 对于我在这个问题中强调的问题不是很有用。

【问题讨论】:

  • 如果这是一个正确的答案,我建议不要在查询字符串中使用前缀名称(例如,“dbpedia:So_and_So”或“dbo:So_and_so”),如果你总是使用绝对URI,那么您不必担心要连接 actor 的具体内容。然后你只剩下“给定actor的值,我应该使用什么URI?这可能是一个更容易回答的问题,然后你只需将“{2}”替换为“".
  • @JoshuaTaylor 任何建议都很好,谢谢!您的想法很有意义,我想我已经尝试以类似的方式处理它,但是绝对 URI 对我来说是一个新概念。很抱歉很痛苦,但是您知道在这种情况下可以帮助我使用绝对 URI 的任何资源吗?谢谢!
  • 抱歉,“绝对 URI”这个词不适合使用,因为像 dbpedia:foo do 这样的东西代表绝对 URI。我的意思是dbpedia:http://dbpedia.org/resource/ 的前缀,所以dbpedia:foo 实际上是http://dbpedia.org/resource/foodbo:(可能)是http://dbpedia.org/ontology/,所以dbo:Film实际上是http://dbpedia.org/ontology/Film。您拥有的大 if/else/else if 块似乎正在构建一个前缀名称——如果您可以从 actor 生成完整的 URI,那么您可以用它替换 {2}。即,类似……
  • queryUrl = queryUrl.replace("{2}", "&lt;"+getUriForActor(actor)+"&gt;");,不需要任何 if/else/else-if 混乱。
  • 但总而言之,听起来您收到了文本,并且该文本应该是演员的名字,或者类似的东西。实际搜索具有该标签的资源不是更有意义吗?例如,与其尝试从字符串"Richard Dreyfuss" 生成dbpedia:Richard_Dreyfuss,不如直接使用?actor rdfs:label ?label . filter ( str(?label) = ?actorName ) 查询其中?actorName 由用户提供?

标签: javascript jquery ajax sparql dbpedia


【解决方案1】:

我决定访问the API page output as JSON,这样我就可以从那里访问查询,而不是考虑每种类型的 queryUrl。任何额外的想法和答案将不胜感激,但现在是不必要的。

谢谢!

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多