1

我正在尝试在 XML 和 Turtle 之间创建嵌套映射。为此,我正在使用 RMLMapper v4.9.0。

这是我要映射的示例 XML 文件:

<?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>

这是我想生成的 Turtle 输出:

@prefix ex: <http://example.com/> .

<http://example.com/ns#JaneDoe> a ex:Person .

<http://example.com/ns#JohnDoe> a ex:Person;
    ex:has_address [
        a ex:Address ;
        ex:has_city "Anytown";
        ex:has_number "123";
        ex:has_street "Main" .
    ] ;
    ex:has_address [
        a ex:Address ;
        ex:has_city "Anytown";
        ex:has_number "1234";
        ex:has_street "Second" .
    ] ;
.  

我怎样才能实现这种类型的嵌套/格式?

通过将地址三元组的主题创建为rr:termType rr:BlankNode.
但是,我希望主题不要重复,并且输出方括号而不是 BlankNodes。

@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" ] ;
                            ] ;
    .
4

0 回答 0