RDF4J 中的类型文字 "tricky" 是吗?

Are typed literals "tricky" in RDF4J?

在 RDF 中,我可以拥有一个由单个 属性 绑定到多个文字值的实体。也可以键入这些值以增加清晰度。

:dumpTruck :weight "heavy"^^xsd:string .
:dumpTruck :weight "36000"^^xsd:integer .

在 SPARQL 中,我可以查询他们想要的类型

SELECT  ?w
WHERE
  { :dumpTruck  :weight  ?w
    FILTER ( datatype(?w) = xsd:integer )
  }

在 RDF4J 中是否有类似 getStatement 的东西可以被这样的数据类型约束?

没有可能的先验约束,但您可以 post 处理您的结果以过滤数据类型。例如,您可以按照以下方式使用某些东西(未经测试,但希望您能理解):

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()); 

我确定有几个 other/handier 快捷方式可用,但我没有想到。然而,RDF4J docs 有教程和示例可供使用。