Как построить запросы SPARQL в java?
есть ли библиотека, которая может создавать запросы SPARQL программно, как CriteriaBuilder
в JPA или построить запросы, как с PreparedStatement
для SQL?
похожие (для SQL): самый чистый способ построить строку SQL в Java
8 ответов
вы можете программно создавать запросы в Jena, используя два метода: синтаксис или алгебру. Есть введение в Jena wiki.
используя алгебру, вы бы сделали что-то вроде:
Op op;
BasicPattern pat = new BasicPattern(); // Make a pattern
pat.add(pattern); // Add our pattern match
op = new OpBGP(pat); // Make a BGP from this pattern
op = OpFilter.filter(e, op); // Filter that pattern with our expression
op = new OpProject(op, Arrays.asList(Var.alloc("s"))); // Reduce to just ?s
Query q = OpAsQuery.asQuery(op); // Convert to a query
q.setQuerySelectType(); // Make is a select query
(взято со страницы wiki)
это не CriteriaBuilder
(и не должно было быть), но это часть пути туда. Вы OpJoin
а и OpUnion
когда вы хотите или, и т. д. Болевые точки-это выражения в моем опыте: вы, вероятно, хотите разберите их из строки.
последние версии Jena добавили StringBuilder
style API для построения строк запросов / обновлений и их параметризации при желании.
этот класс называется ParameterizedSparqlString
, вот пример использования его для создания запроса:
ParameterizedSparqlString queryStr = new ParameterizedSparqlString();
queryStr.setNSPrefix("sw", "http://skunkworks.example.com/redacted#");
queryStr.append("SELECT ?a ?b ?c ?d");
queryStr.append("{");
queryStr.append(" ?rawHit sw:key");
queryStr.appendNode(someKey);
queryStr.append(".");
queryStr.append(" ?rawHit sw:a ?a .");
queryStr.append(" ?rawHit sw:b ?b .");
queryStr.append(" ?rawHit sw:c ?c . ");
queryStr.append(" ?rawHit sw:d ?d .");
queryStr.append("} ORDER BY DESC(d)");
Query q = queryStr.asQuery();
отказ от ответственности - Я разработчик, который внес эту функциональность в Jena
посмотреть каков наилучший способ параметизации запросов SPARQL? более подробно об этом через различные API.
я реализовал SPARQL Java - своего рода DSL для написания запросов SPARQL на Java.
он решает проблему с автоматическим форматированием IDE связанных строк запросов SPARQL и тому подобное.
например:
String shortQuery = Q.prefix("books", "http://example.org/books#")
.select("?book ?authorName", new where() {
{
$("?book books:author ?author");
$("?author books:authorName ?authorName");
}
}).get();
Я недавно начал использовать Сезам query builder. Он выглядит многообещающим, за исключением того, что он не предоставляет много документации, и я изо всех сил пытался найти примеры. Вот простой пример, который может помочь вам начать работу:
ParsedTupleQuery query = QueryBuilderFactory
.select("pubProperty", "pubPropertyValue")
.group()
.atom(cmResource(resourceId), LinkPublicationsTransformation.REFERENCE_URI, "pubUri")
.atom("pubUri", "pubProperty", "pubPropertyValue")
.filter(isLiteral("pubPropertyValue"))
.closeGroup()
.query();
просто обратите внимание, что isLiteral
и cmResource
мой собственный маленький статичных классов. isLiteral
расшифровывается как new IsLiteral(new Var("..."))
например, где последний создает URI с моим сильно используемым префиксом.
вы можете быть также заинтересованы в SPARQLQueryRenderer
, который может превратить ParsedQuery
на String
что может быть удобно для дальнейшего использования.
если вы используете String(Builder)
подходите к тому, что я отговариваю вас делать, по крайней мере, посмотрите на RenderUtils
С sesame-queryrendered
который имеет все удобные методы для добавления <
>
вокруг Урис, побег специальные символы и т. д.
на Сезам framework предлагает API репозитория, который несколько похож на JDBC - он позволяет создавать подготовленный объект запроса и вводить привязки переменных перед его выполнением:
String query = "SELECT * WHERE {?X ?P ?Y }";
TupleQuery preparedQuery = conn.prepareQuery(QuerLanguage.SPARQL, query);
preparedQuery.setBinding("X", someValue);
...
TupleQueryResult result = preparedQuery.evaluate();
Jena предоставляет QueryBuilder в дополнительном пакете.
https://jena.apache.org/documentation/extras/querybuilder/index.html
Он делает то, что вы хотите.
можно использовать Семантическая Структура Jena (документация SPARQL). Также взгляните на этот вопрос. К сожалению, его синтаксис ближе к SQL PreparedStatement, чем к JPA.
Я только что выпустил бета-проект, чтобы сделать именно это, называется Spanqit.
Я стремился к удобочитаемости и интуитивно понятному интерфейсу, например, вот пример синтаксиса Spanqit для создания запроса:
query.prefix(foaf).select(name)
.where(x.has(foaf.iri("name"), name))
.orderBy(name)
.limit(5)
.offset(10);
проверьте это, и не стесняйтесь комментировать и предлагать улучшения!