Are typed literals “tricky” in RDF4J?

2019-07-09 03:40发布

问题:

In RDF, I can have an entity that is bound by a single property to multiple literal values. Those values can also be typed to add clarity.

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

In SPARQL, I can query for just they type I want

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

Is there something like getStatement in RDF4J that can be constrained by datatype like that?

回答1:

There's no a priori constraint possible, but you can post-process your result to filter on the datatype. For example you could use something along these lines (untested but you get the drift hopefully):

QueryResults.stream(conn.getStatements(dumptruck, weight, null))
            .filter(s -> ((Literal)s.getObject()).getDatatype().equals(XMLSchema.INTEGER))
            .collect(Collectors.toList());

Or alternatively, stick in a Model first and then filter:

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

I'm sure there's a couple of other/handier shortcuts available that I haven't thought of. The RDF4J docs have tutorials and examples to spare, however.



标签: sparql rdf4j