В 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, он ни в коем случае не защищен от ошибок, поскольку работает исключительно натекстовый уровень.Текущая версия кода обращается к некоторым возможным векторам атак, которые разработчики определили, но мы не утверждаем, что были достаточно хитрыми, чтобы продумать и предотвратить каждый возможный вектор атаки.
Я подозреваю, что построение запросовнемного безопаснее от такого рода атак.Также здесь это другой вопрос о пределах ParameterizedSparqlString.