我想写一个与此类似的查询-
select ?s ?p ?o where {?s ?p ?o. ?s rdf:subClassOf + mySpecificSubjectValue +}
是否存在任何现有方法?还是我必须通过检查所有主题来手动完成。而且我也不想在查询中使用正则表达式,导致正则表达式产生一些问题,例如:base:hotel和base:hotelName
答案 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的限制的另一种说法。