1

我正在玩芝麻的 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)

如何从 a 获取有关StatementPattern它是否是的信息OPTIONAL

4

1 回答 1

1

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

StatementPattern或者,您可以从通孔在查询模型中向上传播getParent并像这样检查树 - 这可能会更加困难,因为它LeftJoin可能不一定是 SP 的直接父级。

于 2013-06-11T22:27:48.620 回答