Разбор запросов SPARQL - PullRequest
       28

Разбор запросов SPARQL

4 голосов
/ 08 августа 2011

Мне нужно проверить определенное структурное свойство пары миллионов запросов SPARQL, и для этого мне нужна структура оператора WHERE. В настоящее время я пытаюсь использовать fyzz для этого, но, к сожалению, его документация не очень полезна. Парсинг запросов прост, проблема в том, что я не смог восстановить структуру оператора. Например:

>>> from fyzz import parse
>>> a=parse("SELECT * WHERE {?x a ?y . {?x a ?z}}")
>>> b=parse("SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}")
>>> a.where==b.where
True
>>> a.where
[(SparqlVar('x'), ('', 'a'), SparqlVar('y')), (SparqlVar('x'), ('', 'a'), SparqlVar('y'))]

Есть ли способ восстановить фактическое дерево разбора в fyzz вместо троек или какой-нибудь другой инструмент, который позволил бы мне это сделать? RDFLib, кажется, в прошлом имел синтаксический анализатор бизонов SPARQL, но я не могу найти его в пакетах rdflib или rdfextras.sparql.

Спасибо

Ответы [ 2 ]

5 голосов
/ 08 августа 2011

Другим инструментом является roqet инструмент, упакованный в rasqal .Это инструмент командной строки, который возвращает проанализированное дерево.Например:

roqet -i laqrs -d structure -n -e "SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}"

будет выводить ..

Query:
query verb: SELECT
query bound variables (3): x, y, z
query Group graph pattern[0] {
  sub-graph patterns (2) {
    Basic graph pattern[1] #0 {
      triples {
        triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(y)) }
      }
    }
    Optional graph pattern[2] #1 {
      sub-graph patterns (1) {
        Basic graph pattern[3] #0 {
          triples {
            triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(z)) }
          }
        }
      }
    }
  }
}

Глядя на ваш комментарий в другом ответе, я не думаю, что это то, что вам нужно.И я не думаю, что вы найдете ответ, заглянув в парсеры SPARQL.Оценка объекта (или тройного шаблона) в запросе происходит внутри Query Engines, который в хорошо спроектированных системах изолирован от анализа запроса.

Например, в 4store вы можете посмотреть на команду 4s-query спараметр -vvv (очень подробный), в котором вы увидите выходные данные о том, как выполнялся запрос и как выполнялись замены для каждой оценки тройного шаблона.

3 голосов
/ 08 августа 2011

ANTLR имеет грамматику SPARQL здесь: http://www.antlr.org/grammar/1200929755392/index.html

ANTLR может генерировать код синтаксического анализа для запуска Python.

...