Apache Jena中的SPARQL查询

时间:2018-09-21 19:58:56

标签: java sparql jena

我想写一个与此类似的查询-

select ?s ?p ?o where {?s ?p ?o. ?s rdf:subClassOf + mySpecificSubjectValue +}

是否存在任何现有方法?还是我必须通过检查所有主题来手动完成。而且我也不想在查询中使用正则表达式,导致正则表达式产生一些问题,例如:base:hotel和base:hotelName

1 个答案:

答案 0 :(得分:0)

Jena具有一组可用于构建查询实例的类。 这是一个构建像您这样的查询的示例:

String yourclassuri =  "base:hotel" ;
    //Intialize the select statatment
    Query select = new Query();

    //set prefixes
    select.setPrefix("rdf","rdfurl");
    select.setPrefix("base","yourbaseurl");

    select.setQuerySelectType();
    select.addResultVar("s");
    select.addResultVar("p");
    select.addResultVar("o");

    final ElementPathBlock elementPathBlock = new ElementPathBlock();

    //create the first pattern in the where
    final Node s = NodeFactory.createVariable("s");
    final Node p = NodeFactory.createVariable("p");
    final Node o = NodeFactory.createVariable("o");
    elementPathBlock.addTriple(new Triple(s,p,o));

    //create the last pattern
    final Node subclass = NodeFactory.createURI("rdf:subClassOf");
    final Node rdfclass = NodeFactory.createURI(yourclassuri);
    elementPathBlock.addTriple(new Triple(s,subclass,rdfclass));

    select.setQueryPattern(elementPathBlock);

    //serialize the query in a string
    String query = select.serialize();

    //output select ?s ?p ?o where {?s ?p ?o. ?s rdf:subClassOf base:hotel}

来源:Jena javadoc

请注意,您可以使用ParametrizedSparqlString,但是当您要插入前缀名称(例如 base:name )时,它似乎无效。 Javadoc还警告可能的SPARQL注入问题:

  

SPARQL注射说明

     

尽管该类的部分目的是为了防止SPARQL注入,但它绝不是万无一失的,因为它仅在文本级别起作用。当前版本的代码解决了开发人员已经确定的一些可能的攻击媒介,但我们并没有声称自己足够狡猾以至于没有考虑并阻止每种可能的攻击媒介。

我怀疑查询构建对于这种攻击更为安全。 同样,here是关于ParameterizedSparqlString的限制的另一种说法。