rdf:id 的 rdf4j 过滤器模型
rdf4j filter model by rdf:id
在 rdf4j 中是否可以通过 rdf:id
过滤模型?我已经尝试过以下方法:
model.filter(res, null, null)
但是有了这个,我也得到了所有出现的 rdf:resource
和 rdf:about
。目前,我首先过滤整个模型以查找所有出现的所需类型(returns 一个模型)。然后我为资源过滤这个模型并使用这个资源,我为所需的模型部分过滤整个模型:
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);
我认为我的解决方案产生了过多的开销,因为我还需要为每种类型创建一个 typeModel
。是否有另一种过滤 rdf:id
模型的方法?
更新:
这是一个简短的例子:我需要在 Terminal.ConductingEquipment
的 rdf:resource
的帮助下找到 ACLineSegment
。
<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>
您永远不应该阅读使用 RDF/XML 语法的 RDF 文档 - 正如您已经认识到的那样,这不是真正的人类可读的并且设计为机器的交换格式。 RDF 数据集包含一组三元组,查看这些三元组的良好格式是 N-Triples 或 Turtle。
我将你的数据转换为 N-Triples(我假设 http://example.org/
是前缀 cim
的命名空间,http://example.org/data
作为基础 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三元组。
你的任务是
借助 Terminal.ConductingEquipment
的 rdf:resource
找到 ACLineSegment
这个公式听起来超级人工,而不是人类在查询数据时会说的话。我试着翻译了一下(我不习惯数据的域):
给定Terminal
,给我它的Terminal.ConductingEquipment
元素
那么到目前为止我们有什么?
- 我们有终端,即我们有
http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911
.
- 我们也知道你要获取对象的谓词是
cim:ACLineSegment
这是什么意思?我们有一个 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
的名称空间 - 你应该替换上面代码中的 this 具有正确的值。
在 rdf4j 中是否可以通过 rdf:id
过滤模型?我已经尝试过以下方法:
model.filter(res, null, null)
但是有了这个,我也得到了所有出现的 rdf:resource
和 rdf:about
。目前,我首先过滤整个模型以查找所有出现的所需类型(returns 一个模型)。然后我为资源过滤这个模型并使用这个资源,我为所需的模型部分过滤整个模型:
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);
我认为我的解决方案产生了过多的开销,因为我还需要为每种类型创建一个 typeModel
。是否有另一种过滤 rdf:id
模型的方法?
更新:
这是一个简短的例子:我需要在 Terminal.ConductingEquipment
的 rdf:resource
的帮助下找到 ACLineSegment
。
<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>
您永远不应该阅读使用 RDF/XML 语法的 RDF 文档 - 正如您已经认识到的那样,这不是真正的人类可读的并且设计为机器的交换格式。 RDF 数据集包含一组三元组,查看这些三元组的良好格式是 N-Triples 或 Turtle。
我将你的数据转换为 N-Triples(我假设 http://example.org/
是前缀 cim
的命名空间,http://example.org/data
作为基础 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三元组。
你的任务是
借助 Terminal.ConductingEquipment
rdf:resource
找到 ACLineSegment
这个公式听起来超级人工,而不是人类在查询数据时会说的话。我试着翻译了一下(我不习惯数据的域):
给定Terminal
,给我它的Terminal.ConductingEquipment
元素
那么到目前为止我们有什么?
- 我们有终端,即我们有
http://example.org/data#_8fd6a918-5a8d-42f2-ae19-3ee77bc76911
. - 我们也知道你要获取对象的谓词是
cim:ACLineSegment
这是什么意思?我们有一个 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
的名称空间 - 你应该替换上面代码中的 this 具有正确的值。