Создание URL-адресов для запроса sparql, использующего dbpedia

Я работаю над разработкой внешнего интерфейса для службы, в которой в настоящее время пользователи создают свой собственный запрос 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 не очень полезен для моей проблемы, которую я выделил в этом вопросе.


person Sophie    schedule 23.07.2014    source источник
comment
Если это не правильный ответ, я бы предложил вместо использования имен с префиксом в строке запроса (например, dbpedia:So_and_So или dbo:So_and_so), если вы всегда используете абсолютные URI, вам не нужно беспокоиться о каких-либо в частности, с чем объединить actor. Тогда у вас просто остается вопрос: учитывая значение actor, какой URI мне следует использовать? Возможно, на этот вопрос будет проще ответить, а затем вы просто замените {2} на ‹+uriForActor(actor)+›.   -  person Joshua Taylor    schedule 23.07.2014
comment
@JoshuaTaylor Любые советы хороши, спасибо! Ваша идея имеет большой смысл, я думаю, я пытался подойти к ней аналогичным образом, но абсолютные URI - это новая концепция для меня. Извините за боль, но знаете ли вы какие-либо ресурсы, которые помогли бы мне использовать абсолютные URI в этом случае? Спасибо!   -  person Sophie    schedule 24.07.2014
comment
Извините, абсолютный URI нельзя использовать, так как такие слова, как dbpedia: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.2014
comment
queryUrl = queryUrl.replace("{2}", "<"+getUriForActor(actor)+">");, без какой-либо путаницы if/else/else-if.   -  person Joshua Taylor    schedule 24.07.2014
comment
@JoshuaTaylor О, понятно, да, я немного запутался, когда гуглил этот термин! Но теперь я понимаю, что вы имеете в виду, большое спасибо! Я попробую ваше предложение и посмотрю, что я могу сделать. :)   -  person Sophie    schedule 24.07.2014
comment
Я также хотел бы отметить, что SPARQL на самом деле имеет более общий метод выполнения таких вещей, как замена параметров: блоки VALUES. Вы можете написать, например, select ?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.2014
comment
Но в целом, похоже, что вам приходит текст, и этот текст должен быть именем актера или что-то в этом роде. Разве не было бы более разумно искать ресурсы, которые имеют такой ярлык? Например, вместо того, чтобы пытаться сгенерировать dbpedia:Richard_Dreyfuss из строки "Richard Dreyfuss", почему бы просто не запросить ?actor rdfs:label ?label . filter ( str(?label) = ?actorName ), где ?actorName предоставляется пользователем?   -  person Joshua Taylor    schedule 24.07.2014
comment
В основном потому, что я подхожу к этому проекту без опыта работы со SPARQL/языками запросов, а запросы уже написаны другими моими коллегами. Я не чувствовал себя достаточно компетентным, чтобы заниматься каким-либо поиском самостоятельно, и мне просто поручили обойти существующие запросы, которые уже были написаны, и представить интерфейсную часть для взаимодействия пользователя, если это имеет смысл. Но ваше предложение хорошее и обоснованное, и его определенно стоит довести до сведения моих коллег. :)   -  person Sophie    schedule 24.07.2014


Ответы (1)


Я решил получить доступ к выводу страницы API в формате JSON, чтобы получить доступ к запросам из там вместо учета каждого типа queryUrl. Буду очень признателен за любые дополнительные мысли и ответы, но сейчас они не нужны.

Спасибо!

person Sophie    schedule 30.07.2014