Я работаю над разработкой внешнего интерфейса для службы, в которой в настоящее время пользователи создают свой собственный запрос 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, которая отображает результаты запроса в виде стол.
То, что я пытаюсь сделать, это создать страницу, которую пользователь может использовать для ввода желаемых параметров «более простым» способом. Итак, вместо того, чтобы вводить limit:100
в запросе SPARQL, я предоставил им текстовое поле под названием «Предел», в которое они затем вводят значение. У меня также есть раскрывающийся список, в котором перечислены все различные типы запросов (например, «Получить события с упоминанием именованного актера», которые я показал вам здесь, или другие, такие как «Получить свойства типа» или «Получить события с конкретная чистая стоимость кадра').
У меня есть файл 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...
Полный код можно найти здесь.
Все это прекрасно работает для того, что я сделал до сих пор, но у меня возникли проблемы с попытками придумать способы краткого изменения строки 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
.. (где актер имеет в виду название вещи), но я думаю, что делать это таким образом было бы неуклюже и могло бы запутаться со всеми различными форматами, которые необходимо было бы учитывать.
Заранее спасибо, и если вам нужна дополнительная информация о моей проблеме, пожалуйста, не стесняйтесь сообщить мне!
изменить: с тех пор я пришел к выводу, что dbpedia-spotlight не очень полезен для моей проблемы, которую я выделил в этом вопросе.
actor
. Тогда у вас просто остается вопрос: учитывая значениеactor
, какой URI мне следует использовать? Возможно, на этот вопрос будет проще ответить, а затем вы просто замените {2} на ‹+uriForActor(actor)+›. - person Joshua Taylor   schedule 23.07.2014dbpedia:foo
do, представляют собой абсолютные 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, который у вас есть, похоже, создает имя с префиксом — если бы вы могли просто сгенерировать полный URI изactor
, то вы могли бы просто заменить{2}
на него. То есть что-то вроде… - person Joshua Taylor   schedule 24.07.2014queryUrl = queryUrl.replace("{2}", "<"+getUriForActor(actor)+">");
, без какой-либо путаницы if/else/else-if. - person Joshua Taylor   schedule 24.07.2014select ?x ?y where { ?x ?p ?y . filter( ?y < ?z ) }
, вы можете добавить, например,values (?p ?z) { (ex:age 40) }
к запросу, чтобы исправить значения?p
и?z
. Это может помочь избежать атак с внедрением (например, подумайте, что произойдет, если кому-то удастся получить значение для uri_0 равнымex:someActor } UNION { ?s ?p ?o
; вы в конечном итоге добавите дополнительный блок UNION, который может сделать что-то вредоносное или привести к утечке информации. - person Joshua Taylor   schedule 24.07.2014dbpedia:Richard_Dreyfuss
из строки"Richard Dreyfuss"
, почему бы просто не запросить?actor rdfs:label ?label . filter ( str(?label) = ?actorName )
, где?actorName
предоставляется пользователем? - person Joshua Taylor   schedule 24.07.2014