如何使用Sesame解析SPARQL查询中的OPTIONAL语句?

时间:2013-06-11 09:01:34

标签: java sesame

我正在玩Sesame的queryparser-sparql lib,但我似乎无法从解析的查询中获取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的信息?

1 个答案:

答案 0 :(得分:1)

解决问题的唯一方法是检查它是否作为LeftJoin的右手参数的一部分出现。一个相对简单的方法就是实现一个QueryModelVisitor,它在遇到左连接并下降其右侧参数时设置某种标志。

或者,您可以从StatementPattern通过getParent在查询模型中进行备份传播,然后像这样检查树 - 这可能会更难,但LeftJoin可能不一定成为SP的直接父母。