Как я могу анализировать ДОПОЛНИТЕЛЬНЫЕ операторы из запроса SPARQL с помощью Sesame?

Я играю с библиотекой Sesame queryparser-sparql, но не могу получить OPTIONAL операторы из проанализированного запроса.

Учитывая запрос:

PREFIX ex: <http://example.com/#>
SELECT * WHERE {
  ?s a ex:Foo .
  OPTIONAL { ?s ex:someProperty ?property }
} LIMIT 10

Разбираем его с помощью следующего кода (используя Sesame 2.7.2):

SPARQLParserFactory factory = new SPARQLParserFactory();
QueryParser parser = factory.getParser();
ParsedQuery parsedQuery = parser.parseQuery(sparqlQuery, null);

StatementPatternCollector collector = new StatementPatternCollector();
TupleExpr tupleExpr = parsedQuery.getTupleExpr();
tupleExpr.visit(collector);

for (StatementPattern pattern : collector.getStatementPatterns()) {
    System.out.println(pattern);
}

печать parsedQuery дает:

Slice ( limit=10 )
   Projection
      ProjectionElemList
         ProjectionElem "s"
         ProjectionElem "property"
      LeftJoin
         StatementPattern
            Var (name=s)
            Var (name=-const-1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
            Var (name=-const-2, value=http://example.com/#Foo, anonymous)
         StatementPattern
            Var (name=s)
            Var (name=-const-3, value=http://example.com/#someProperty, anonymous)
            Var (name=property)

печать каждого pattern дает:

StatementPattern
   Var (name=s)
   Var (name=-const-1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
   Var (name=-const-2, value=http://example.com/#Foo, anonymous)

StatementPattern
   Var (name=s)
   Var (name=-const-3, value=http://example.com/#someProperty, anonymous)
   Var (name=property)

Как я могу получить информацию от StatementPattern о том, является ли он OPTIONAL?


person NoMoreMrCodeGuy    schedule 11.06.2013    source источник


Ответы (1)


Единственный способ выяснить это — проверить, встречается ли оно как (часть) правого аргумента LeftJoin. Относительно простой способ понять это — реализовать QueryModelVisitor, который устанавливает какой-то флаг всякий раз, когда встречает левое соединение и спускается вниз по правому аргументу.

В качестве альтернативы вы можете выполнить резервное копирование в модели запроса от StatementPattern через getParent и таким образом проверить дерево - это может быть сложнее, поскольку LeftJoin не обязательно может быть непосредственным родителем SP.

person Jeen Broekstra    schedule 11.06.2013
comment
Работает как шарм, с помощью QueryModelVisitorBase я могу получить нужную мне информацию. Спасибо! - person NoMoreMrCodeGuy; 12.06.2013