使用RMLMapper的嵌套XML到Turtle映射
我试图在XML和Turtle之间创建嵌套映射。为此,我正在使用rmlmapperv4.9.0 下面是我要映射的示例XML文件:使用RMLMapper的嵌套XML到Turtle映射,xml,rdf,turtle-rdf,rml-rdf,Xml,Rdf,Turtle Rdf,Rml Rdf,我试图在XML和Turtle之间创建嵌套映射。为此,我正在使用rmlmapperv4.9.0 下面是我要映射的示例XML文件: <?xml version="1.0" encoding="utf-8"?> <persons> <person> <name>JohnDoe</name> <address> <numbe
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person>
<name>JohnDoe</name>
<address>
<number>123</number>
<street>Main</street>
<city>Anytown</city>
</address>
<address>
<number>1234</number>
<street>Second</street>
<city>Anytown</city>
</address>
</person>
<person>
<name>JaneDoe</name>
</person>
</persons>
我使用了以下地图:
@prefix rml: <http://semweb.mmlab.be/ns/rml#>.
@prefix ql: <http://semweb.mmlab.be/ns/ql#>.
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix ex: <http://example.com/> .
@base <http://example.com/ns#> .
_:personMap a rr:TriplesMap ;
# XML source file with xPath iterator
rml:logicalSource [
rml:source "example.xml" ;
rml:referenceFormulation ql:XPath ;
rml:iterator "//*[local-name()='person']"
] ;
rr:subjectMap [
rml:reference "name" ;
rr:class ex:Person ;
] ;
# address
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_address ] ;
rr:objectMap [
rr:parentTriplesMap _:addressMap ;
rr:joinCondition [
rr:child "name" ;
rr:parent "ancestor::*/name" ;
] ;
] ;
] ;
.
_:addressMap a rr:TriplesMap ;
# XML source file with xPath iterator
rml:logicalSource [
rml:source "example.xml" ;
rml:referenceFormulation ql:XPath ;
rml:iterator "//*[local-name()='address']"
] ;
rr:subjectMap [
rr:termType rr:BlankNode ;
rr:class ex:Address
] ;
# city
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_city ] ;
rr:objectMap [ rml:reference "city" ] ;
] ;
# street
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_street ] ;
rr:objectMap [ rml:reference "street" ] ;
] ;
# number
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_number ] ;
rr:objectMap [ rml:reference "number" ] ;
] ;
.
@前缀rml:。
@前缀ql:。
@前缀rr:。
@前缀ex:。
@基地。
_:personMap a rr:TripleMap;
#带有xPath迭代器的XML源文件
rml:逻辑源[
rml:source“example.xml”;
rml:referenceFormulation ql:XPath;
rml:iterator“/*[local-name()='person']”
] ;
主题图[
rml:参考“名称”;
rr:类别ex:个人;
] ;
#地址
rr:PredicateObject映射[
rr:predicateMap[rr:constant ex:has_address];
rr:objectMap[
rr:ParentTripleMap 3;:addressMap;
rr:连接条件[
rr:子“名称”;
rr:parent“祖先::*/name”;
] ;
] ;
] ;
.
_:addressMap a rr:TripleMap;
#带有xPath迭代器的XML源文件
rml:逻辑源[
rml:source“example.xml”;
rml:referenceFormulation ql:XPath;
rml:迭代器“/*[local-name()='address']”
] ;
rr:subjectMap[
rr:termType rr:BlankNode;
rr:类ex:地址
] ;
#城市
rr:PredicateObject映射[
rr:predicateMap[rr:constant ex:has_city];
rr:objectMap[rml:参考“城市”];
] ;
#街头
rr:PredicateObject映射[
rr:predicateMap[rr:constant ex:has_street];
rr:objectMap[rml:参考“街道”];
] ;
#数
rr:PredicateObject映射[
rr:predicateMap[rr:constant ex:has_number];
rr:objectMap[rml:参考“编号”];
] ;
.
您的“问题”只是序列化的问题,因为两个文档在语义上是等价的。如果您的R2RML处理器不允许更紧凑的处理,那么您必须使用其他一些API作为后处理。例如,使用ApacheJena-RIOT,您可以在这里执行RIOT--syntax=Turtle--formatted=Turtle您的\u-Turtle\u文件\u.ttl
,它将打印您想要的内容。请注意,对于较大的文件,这可能会占用内存,因为在按主题进行分组之前,您必须跟踪三元组。来自@UninformedUser的注释是正确的(这应该转化为答案)。这两个文档在语义上是等价的。您的“问题”只是序列化的问题,因为这两个文档在语义上是等价的。如果您的R2RML处理器不允许更紧凑的处理,那么您必须使用其他一些API作为后处理。例如,使用ApacheJena-RIOT,您可以在这里执行RIOT--syntax=Turtle--formatted=Turtle您的\u-Turtle\u文件\u.ttl
,它将打印您想要的内容。请注意,对于较大的文件,这可能会占用内存,因为在按主题进行分组之前,您必须跟踪三元组。来自@UninformedUser的注释是正确的(这应该转化为答案)。这两个文档在语义上是等价的。
@prefix ex: <http://example.com/> .
<http://example.com/ns#JaneDoe> a ex:Person .
<http://example.com/ns#JohnDoe> a ex:Person;
ex:has_address _:0 .
_:0 a ex:Address;
ex:has_city "Anytown";
ex:has_number "123";
ex:has_street "Main" .
<http://example.com/ns#JohnDoe> ex:has_address _:1 .
_:1 a ex:Address;
ex:has_city "Anytown";
ex:has_number "1234";
ex:has_street "Second" .
@prefix rml: <http://semweb.mmlab.be/ns/rml#>.
@prefix ql: <http://semweb.mmlab.be/ns/ql#>.
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix ex: <http://example.com/> .
@base <http://example.com/ns#> .
_:personMap a rr:TriplesMap ;
# XML source file with xPath iterator
rml:logicalSource [
rml:source "example.xml" ;
rml:referenceFormulation ql:XPath ;
rml:iterator "//*[local-name()='person']"
] ;
rr:subjectMap [
rml:reference "name" ;
rr:class ex:Person ;
] ;
# address
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_address ] ;
rr:objectMap [
rr:parentTriplesMap _:addressMap ;
rr:joinCondition [
rr:child "name" ;
rr:parent "ancestor::*/name" ;
] ;
] ;
] ;
.
_:addressMap a rr:TriplesMap ;
# XML source file with xPath iterator
rml:logicalSource [
rml:source "example.xml" ;
rml:referenceFormulation ql:XPath ;
rml:iterator "//*[local-name()='address']"
] ;
rr:subjectMap [
rr:termType rr:BlankNode ;
rr:class ex:Address
] ;
# city
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_city ] ;
rr:objectMap [ rml:reference "city" ] ;
] ;
# street
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_street ] ;
rr:objectMap [ rml:reference "street" ] ;
] ;
# number
rr:predicateObjectMap [
rr:predicateMap [ rr:constant ex:has_number ] ;
rr:objectMap [ rml:reference "number" ] ;
] ;
.