rdf4j过滤器模型由rdf:id

时间:2017-09-01 08:25:05

标签: java rdf rdf4j

rdf4j是否可以按rdf:id过滤模型?我已经尝试了以下方法:

model.filter(res, null, null)

但有了这个,我也会出现rdf:resourcerdf:about。目前,我首先筛选出所需类型(返回模型)的所有实例的整个模型。然后我为资源过滤了这个模型,使用这个资源,我过滤了所需模型部分的整个模型:

Model typeModel = model.filter(null, RDF.TYPE, iri);
// the following obj contains only the id (found in an rdf:about or rdf:resource)
// normally I also do some checks before .iterator().next()
Resource res = typeModel.filter((Resource) obj, null, null).subjects().iterator().next();
Model resModel = model.filter(res, null, null);

我认为我的解决方案会产生太多开销,因为每个Type都需要typeModel。是否有其他方法可以过滤rdf:id的模型?

更新

以下是一个简短示例:我需要在ACLineSegment rdf:resource的帮助下找到Terminal.ConductingEquipment

<cim:Terminal rdf:ID="_8fd6a918-5a8d-42f2-ae19-3ee77bc76911">
  <cim:ACDCTerminal.sequenceNumber>2</cim:ACDCTerminal.sequenceNumber>
  <cim:IdentifiedObject.name>XXXX</cim:IdentifiedObject.name>
  <cim:Terminal.ConductingEquipment rdf:resource="#_50c99578-6e17-45e1-a113-a4a28d643b40" />
  <cim:Terminal.ConnectivityNode rdf:resource="#_eefd8021-6f56-4154-9b2b-9e275c0f43d0" />
  <cim:Terminal.phases rdf:resource="http://iec.ch/TC57/2013/CIM-schema-cim16#PhaseCode.ABC" />
</cim:Terminal>
<cim:ACLineSegment rdf:ID="_50c99578-6e17-45e1-a113-a4a28d643b40">
  <cim:ACLineSegment.b0ch>5.44828e-5</cim:ACLineSegment.b0ch>
  <cim:ACLineSegment.bch>5.44828e-5</cim:ACLineSegment.bch>
  ....
</cim:ACLineSegment>

1 个答案:

答案 0 :(得分:2)

你永远不应该用RDF / XML语法读取你的RDF文档 - 正如你已经认识到的那样,这不是人类可读的并且被设计为机器的交换格式。 RDF数据集包含一组三元组,一个很好的格式来查看这些三元组是N-Triples还是Turtle。

我将您的数据转换为N-Triples(我假设http://example.org/为前缀cimhttp://example.org/data的namspace作为基URI:

<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Terminal> .
<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://example.org/ACDCTerminal.sequenceNumber> "2" .
<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://example.org/IdentifiedObject.name> "XXXX" .
<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://example.org/Terminal.ConductingEquipment> <http://example.org/data#_50c99578-6e17-45e1-a113-a4a28d643b40> .
<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://example.org/Terminal.ConnectivityNode> <http://example.org/data#_eefd8021-6f56-4154-9b2b-9e275c0f43d0> .
<http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911> <http://example.org/Terminal.phases> <http://iec.ch/TC57/2013/CIM-schema-cim16#PhaseCode.ABC> .
<http://example.org/data#_50c99578-6e17-45e1-a113-a4a28d643b40> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/ACLineSegment> .
<http://example.org/data#_50c99578-6e17-45e1-a113-a4a28d643b40> <http://example.org/ACLineSegment.b0ch> "5.44828e-5" .
<http://example.org/data#_50c99578-6e17-45e1-a113-a4a28d643b40> <http://example.org/ACLineSegment.bch> "5.44828e-5" .

事实上,你可以看到有9个RDF三元组。

你的任务是

ACLineSegment

rdf:resource的帮助下找到Terminal.ConductingEquipment

这个配方听起来非常人为,并不是人们在查询数据时所说的。我试图翻译它(我不习惯数据的域名):

鉴于Terminal,请给我Terminal.ConductingEquipment元素

那么到目前为止我们有什么?

  1. 我们有终端,即我们有http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911
  2. 我们也知道您想要获取对象的谓词,它是cim:ACLineSegment
  3. 这是什么意思?我们有一个RDF三元组的主语和谓词,并希望得到它的对象。现在,您应该已经知道解决方案,只需按主语和谓词过滤模型,即

    ValueFactory vf = SimpleValueFactory.getInstance();
    
    // the subject which is the IRI of the terminal
    IRI s = vf.createIRI("**http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911**");
    
    // the predicate which is the IRI of the property cim:Terminal.ConductingEquipment
    IRI p = vf.createIRI("http://example.org/Terminal.ConductingEquipment");
    
    // filter by subject and predicate
    Model filteredModel = model.filter(s, p, null);
    
    // get the object, if one exists
    Resource acLineSegment = Models.objectResource(filteredModel).orElse(null);
    

    不要忘记,我假设http://example.org/data作为RDF / XML文档的基URI,http://example.org/作为前缀cim的名称空间 - 您应该在代码中替换它上面有适当的值。