【发布时间】: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: <http...,但有时是 PREFIX dbo: <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:foodo 这样的东西代表绝对 URI。我的意思是dbpedia:是http://dbpedia.org/resource/的前缀,所以dbpedia:foo实际上是http://dbpedia.org/resource/foo。dbo:(可能)是http://dbpedia.org/ontology/,所以dbo:Film实际上是http://dbpedia.org/ontology/Film。您拥有的大 if/else/else if 块似乎正在构建一个前缀名称——如果您可以从actor生成完整的 URI,那么您可以用它替换{2}。即,类似…… -
…
queryUrl = queryUrl.replace("{2}", "<"+getUriForActor(actor)+">");,不需要任何 if/else/else-if 混乱。 -
但总而言之,听起来您收到了文本,并且该文本应该是演员的名字,或者类似的东西。实际搜索具有该标签的资源不是更有意义吗?例如,与其尝试从字符串
"Richard Dreyfuss"生成dbpedia:Richard_Dreyfuss,不如直接使用?actor rdfs:label ?label . filter ( str(?label) = ?actorName )查询其中?actorName由用户提供?
标签: javascript jquery ajax sparql dbpedia