Sparql 是类型化的文字;“棘手的”;在RDF4J中?

Sparql 是类型化的文字;“棘手的”;在RDF4J中?,sparql,rdf4j,Sparql,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

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

:dumpTruck :weight "heavy"^^xsd:string .
:dumpTruck :weight "36000"^^xsd:integer .
在SPARQL中,我可以查询我想要的类型

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

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

没有可能的先验约束,但您可以对结果进行后期处理,以对数据类型进行过滤。例如,您可以使用以下内容(未经测试,但希望您能了解要点):

QueryResults.stream(conn.getStatements(dumptruck,weight,null))
.filter(s->((文本)s.getObject()).getDatatype().equals(XMLSchema.INTEGER))
.collect(Collectors.toList());
或者,先插入
型号
,然后过滤:

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

我肯定还有一些我没有想到的其他捷径。不过,本课程还有教程和示例可供参考

不,不像远程存储库那样,在提供查询模板方面需要付出太多的努力。-甚至不适用于内存模型。但是,您可以编写自己的实用程序类来提供这些方便的方法。例如运行
getStatement
,然后在
^^xsd:
上对语句对象进行字符串拆分,然后在拆分数组的块2中对我所需的xsd类型进行
grep
ing?有时,仅仅因为您可以执行某些操作,但这并不意味着你应该这么做。从
{:dumpTruck:weightClass“heavy”^^xsd:string;:weightkg“36000”^^xsd:integer.}
可以获得更好的总体结果
:weightClass
甚至可以从
:weightkg
值推断出来。@talletd。。。对,这正是我想要避免的!对不起,我应该在问题中加上这个。如果可能的话,我想坚持现实主义/BFO原则。我可能只会使用标量值规范。