Являются ли введенные литералы "хитрыми" в RDF4J?
В RDF у меня может быть сущность, которая связана одним свойством с несколькими литеральными значениями. Эти значения также могут быть напечатаны, чтобы добавить ясности.
:dumpTruck :weight "heavy"^^xsd:string .
:dumpTruck :weight "36000"^^xsd:integer .
В SPARQL я могу запросить только тот тип, который я хочу
SELECT ?w
WHERE
{ :dumpTruck :weight ?w
FILTER ( datatype(?w) = xsd:integer )
}
Есть ли что-то вроде getStatement в RDF4J, которое может быть ограничено таким типом данных?
1 ответ
Решение
Априорное ограничение невозможно, но вы можете постобработать свой результат для фильтрации по типу данных. Например, вы можете использовать что-то вроде этого (не проверено, но, надеюсь, вы получите дрейф):
QueryResults.stream(conn.getStatements(dumptruck, weight, null))
.filter(s -> ((Literal)s.getObject()).getDatatype().equals(XMLSchema.INTEGER))
.collect(Collectors.toList());
Или, альтернативно, сунуть Model
сначала, а затем фильтр:
Model m = QueryResults.asModel(conn.getStatements(dumptruck, weight, null));
List intValues = Models.objectLiterals(m).stream().filter(l -> l.getDatatype().equals(XMLSchema.INTEGER)).collect(Collectors.toList());
Я уверен, что есть несколько других / более удобных ярлыков, о которых я даже не думал. Однако в документации по RDF4J есть учебники и примеры.