Являются ли введенные литералы "хитрыми" в 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 есть учебники и примеры.

Другие вопросы по тегам