Сложно ли использовать типизированные литералы в 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, который может быть ограничен таким типом данных?


person Mark Miller    schedule 25.07.2017    source источник
comment
Нет, это не так, как для удаленных репозиториев, для предоставления шаблонов запросов потребуется слишком много усилий. - даже не для in-memory модели. Но вы можете написать свой собственный служебный класс, предоставляющий эти удобные методы.   -  person UninformedUser    schedule 25.07.2017
comment
например, запустить getStatement, затем разбить строки объектов оператора на ^^xsd:, а затем greping для моего желаемого типа xsd в фрагменте 2 разделенного массива?   -  person Mark Miller    schedule 25.07.2017
comment
Иногда то, что вы можете что-то сделать, не означает, что вы должны это делать. Лучшие общие результаты были бы получены от { :dumpTruck :weightClass "heavy"^^xsd:string ; :weightKilograms "36000"^^xsd:integer . }. :weightClass можно даже вывести из :weightKilograms значений.   -  person TallTed    schedule 25.07.2017
comment
@TallTed... именно этого я и пытался избежать! Извините, надо было добавить это к вопросу. Если возможно, я хотел бы придерживаться принципов реализма/BFO. Я могу просто использовать спецификации скалярных значений http://www.ontobee.org/ontology/OBI?iri=http://purl.obolibrary.org/obo/OBI_0001931.   -  person Mark Miller    schedule 25.07.2017


Ответы (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 есть дополнительные руководства и примеры.

person Jeen Broekstra    schedule 26.07.2017