RML 和 FnO 无法一起运行

如何解决RML 和 FnO 无法一起运行

我正在尝试在 rml 映射器中使用 FnO 函数(我喜欢做 string_split 之类的 here)。 这是我的文件夹的样子:

enter image description here

我正在执行 java -jar "rmlmapper.jar" -m mapping-cuisines.ttl -o output-cuisines.ttl -s turtle

但是,当我尝试实现 <#FunctionMap> 时,我收到以下错误消息:

Exception in thread "main" java.lang.indexoutofboundsexception: Index 0 out of bounds for length 0
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
        at java.base/java.util.Objects.checkIndex(Objects.java:372)
        at java.base/java.util.ArrayList.get(ArrayList.java:458)
        at be.ugent.rml.functions.DynamicMultipleRecordsFunctionExecutor.execute(DynamicMultipleRecordsFunctionExecutor.java:66)
        at be.ugent.rml.functions.AbstractSingleRecordFunctionExecutor.execute(AbstractSingleRecordFunctionExecutor.java:17)
        at be.ugent.rml.termgenerator.LiteralGenerator.generate(LiteralGenerator.java:42)
        at be.ugent.rml.Executor.generatePredicateObjectGraphs(Executor.java:157)
        at be.ugent.rml.Executor.executeWithFunction(Executor.java:115)
        at be.ugent.rml.Executor.execute(Executor.java:76)
        at be.ugent.rml.cli.Main.main(Main.java:206)

对我来说没有任何意义。根据 git repo,这些函数是从我执行 rmlmapper 的地方动态加载的。

数据集:https://mega.nz/file/LsJAQRaR#84lfASPXVA08zm0RbuRfNvR7tx-vklS82D1KBGhhdA8

我的代码

@base <http://example.org/data> .
@prefix ex: <http://example.org/ns#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix rml: <http://semweb.mmlab.be/ns/rml#> .
@prefix ql: <http://semweb.mmlab.be/ns/ql#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-Syntax-ns#> .
@prefix csvw: <http://www.w3.org/ns/csvw#> .
@prefix fnml: <http://semweb.mmlab.be/ns/fnml#> .
@prefix fno: <https://w3id.org/function/ontology#> .
@prefix grel: <http://users.ugent.be/~bjdmeest/function/grel.ttl#> .


<#LogicalSource>
    a rml:LogicalSource;
    rml:source "dataworld-restaurants-cuisines.csv";
    rml:referenceFormulation ql:CSV.


<#MyTriplesMap>
    a rr:TriplesMap;
    rml:logicalSource <#LogicalSource>;

    rr:subjectMap [
        rr:template "http://example.org/{id}";
    ];

    rr:predicateObjectMap [
        rr:predicate ex:aProperty;
        rr:objectMap <#FunctionMap>;
    ].

<#FunctionMap>
    fnml:functionValue [
        rml:logicalSource <#LogicalSource> ;
        rr:predicateObjectMap [
            rr:predicate fno:executes ;
            rr:objectMap [ rr:constant grel:toupperCase ]
        ] ;
        rr:predicateObjectMap [
            rr:predicate grel:valueParameter ;                  
            rr:objectMap [
                rml:reference "spicy"                           
            ]
        ]
    ] .

我的函数.ttl:

@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix doap:    <http://usefulinc.com/ns/doap#> .
@prefix fno:     <https://w3id.org/function/ontology#> .
@prefix fnoi:    <https://w3id.org/function/vocabulary/implementation#> .
@prefix fnom:    <https://w3id.org/function/vocabulary/mapping#> .
@prefix grel:    <http://users.ugent.be/~bjdmeest/function/grel.ttl#> .
@prefix grelm:   <http://fno.io/grel/rmlmapping#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .

grel:toupperCase a fno:Function ;
  fno:name "to Uppercase" ;
  rdfs:label "to Uppercase" ;
  dcterms:description "Returns the input with all letters in upper case." ;
  fno:expects ( grel:valueParam ) ;
  fno:returns ( grel:stringOut ) .

grelm:javaString
    a                  fnoi:JavaClass ;
    doap:download-page "grelFunctions.jar" ;
    fnoi:class-name    "io.fno.grel.StringFunctions" .

grelm:uppercaseMapping
    a                    fnoi:Mapping ;
    fno:function         grel:toupperCase ;
    fno:implementation   grelm:javaString ;
    fno:methodMapping    [ a                fnom:StringMethodMapping ;
                           fnom:method-name "touppercase" ] .

解决方法

我试用了你的映射文件,它工作正常。 您当前的映射文件将 spicy 中的数据转换为大写 并生成指定的 RDF 三元组。 由于函数 grel:toUpperCase 默认包含在 RLMMapper 中, 您不需要 functions.ttl 来指定这些函数。 仅当您想添加自己的自定义函数时才需要这样做。 可以在此处找到 RLMMapper 中所有包含函数的概述:https://rml.io/docs/rmlmapper/default-functions/

举个例子

  1. 从我们的 Github 存储库下载最新的 RLMMapper:https://github.com/RMLio/rmlmapper-java/releases
  2. 将其运行为:java -jar <path to jar> -m mapping.rml.ttl
  3. 我得到了下面列出的输出。

ma​​pping.rml.ttl

@base <http://example.org/data> .
@prefix ex: <http://example.org/ns#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix rml: <http://semweb.mmlab.be/ns/rml#> .
@prefix ql: <http://semweb.mmlab.be/ns/ql#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix csvw: <http://www.w3.org/ns/csvw#> .
@prefix fnml: <http://semweb.mmlab.be/ns/fnml#> .
@prefix fno: <https://w3id.org/function/ontology#> .
@prefix grel: <http://users.ugent.be/~bjdmeest/function/grel.ttl#> .


<#LogicalSource>
    a rml:LogicalSource;
    rml:source "dataworld-restaurants-cuisines.csv";
    rml:referenceFormulation ql:CSV.


<#MyTriplesMap>
    a rr:TriplesMap;
    rml:logicalSource <#LogicalSource>;

    rr:subjectMap [
        rr:template "http://example.org/{id}";
    ];

    rr:predicateObjectMap [
        rr:predicate ex:aProperty;
        rr:objectMap <#FunctionMap>;
    ].

<#FunctionMap>
    fnml:functionValue [
        rml:logicalSource <#LogicalSource> ;
        rr:predicateObjectMap [
            rr:predicate fno:executes ;
            rr:objectMap [ rr:constant grel:toUpperCase ]
        ] ;
        rr:predicateObjectMap [
            rr:predicate grel:valueParameter ;                  
            rr:objectMap [
                rml:reference "spicy"                           
            ]
        ]
    ] .

输出(截断)

<http://example.org/afghani> <http://example.org/ns#aProperty> "NO".
<http://example.org/african> <http://example.org/ns#aProperty> "YES".
<http://example.org/african_portuguese> <http://example.org/ns#aProperty> "YES".
<http://example.org/american> <http://example.org/ns#aProperty> "NO".
<http://example.org/andhra> <http://example.org/ns#aProperty> "YES".
<http://example.org/arabian> <http://example.org/ns#aProperty> "NO".
<http://example.org/arabian_lebanese> <http://example.org/ns#aProperty> "NO".
<http://example.org/arabian_mexican> <http://example.org/ns#aProperty> "NO".
<http://example.org/arabian_middle_eastern> <http://example.org/ns#aProperty> "YES".
<http://example.org/asian> <http://example.org/ns#aProperty> "YES".
<http://example.org/assamese> <http://example.org/ns#aProperty> "NO".
<http://example.org/australian> <http://example.org/ns#aProperty> "YES".
<http://example.org/awadhi> <http://example.org/ns#aProperty> "YES".
<http://example.org/awadhi_mughlai> <http://example.org/ns#aProperty> "NO".
<http://example.org/bakery> <http://example.org/ns#aProperty> "NO".

FnO string_split

如果你想在 RML 中使用 FnO 的 string_split,你可以这样实现:

  1. fno:executesgrel:string_split 使用 GREL 拆分功能。
  2. grel:valueParameter:要拆分的输入字符串。 我在此处引用了 CSV 列 cuisines
  3. grel:p_string_sep:GREL 拆分函数所在的字符串分隔符 必须拆分输入字符串。 我在这里使用了 , 来区分每家餐厅的不同美食。

ma​​pping.rml.ttl

@base <http://example.org> .
@prefix rml: <http://semweb.mmlab.be/ns/rml#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix ql: <http://semweb.mmlab.be/ns/ql#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix fnml: <http://semweb.mmlab.be/ns/fnml#> .
@prefix fno: <https://w3id.org/function/ontology#> .
@prefix grel: <http://users.ugent.be/~bjdmeest/function/grel.ttl#> .
@prefix ex: <http://example.org/ns#> .

<#LogicalSource>
    a rml:LogicalSource;
    rml:source "dataworld-restaurants-cuisines.csv";
    rml:referenceFormulation ql:CSV.


<#MyTriplesMap>
    a rr:TriplesMap;
    rml:logicalSource <#LogicalSource>;

    rr:subjectMap [
        rr:template "http://example.org/{id}";
    ];

    rr:predicateObjectMap [
        rr:predicate ex:cuisine;
        rr:objectMap <#FunctionMap>;
    ];
.

<#FunctionMap>
    fnml:functionValue [
        rml:logicalSource <#LogicalSource>;
        rr:predicateObjectMap [
            rr:predicate fno:executes; 
            rr:objectMap [ 
                rr:constant grel:string_split 
            ];
        ];
        rr:predicateObjectMap [
            rr:predicate grel:valueParameter;
            rr:objectMap [ 
                rml:reference "cuisines" 
            ];
        ];
        rr:predicateObjectMap [
            rr:predicate grel:p_string_sep;
            rr:objectMap [ 
                rr:constant ",";
            ];
        ];
    ].

输出(截断)

<http://example.org/afghani> <http://example.org/ns#cuisine> "Afghani".
<http://example.org/african> <http://example.org/ns#cuisine> "African".
<http://example.org/african_portuguese> <http://example.org/ns#cuisine> "African".
<http://example.org/african_portuguese> <http://example.org/ns#cuisine> "Portuguese".
<http://example.org/american> <http://example.org/ns#cuisine> "american".
<http://example.org/andhra> <http://example.org/ns#cuisine> "Andhra".
<http://example.org/arabian> <http://example.org/ns#cuisine> "Arabian".
<http://example.org/arabian_lebanese> <http://example.org/ns#cuisine> "Arabian".
<http://example.org/arabian_lebanese> <http://example.org/ns#cuisine> "Lebanese".
<http://example.org/arabian_mexican> <http://example.org/ns#cuisine> "Arabian".
<http://example.org/arabian_mexican> <http://example.org/ns#cuisine> "Mexican".
<http://example.org/arabian_middle_eastern> <http://example.org/ns#cuisine> "Arabian".
<http://example.org/arabian_middle_eastern> <http://example.org/ns#cuisine> "Middle Eastern".
<http://example.org/asian> <http://example.org/ns#cuisine> "Asian".
<http://example.org/assamese> <http://example.org/ns#cuisine> "Assamese".
<http://example.org/australian> <http://example.org/ns#cuisine> "Australian".
<http://example.org/awadhi> <http://example.org/ns#cuisine> "Awadhi".
<http://example.org/awadhi_mughlai> <http://example.org/ns#cuisine> "Awadhi".
<http://example.org/awadhi_mughlai> <http://example.org/ns#cuisine> "Mughlai".
<http://example.org/bakery> <http://example.org/ns#cuisine> "bakery".
<http://example.org/bar_food> <http://example.org/ns#cuisine> "Bar Food".
<http://example.org/bar_food_brazilian> <http://example.org/ns#cuisine> "Bar Food".
<http://example.org/bar_food_brazilian> <http://example.org/ns#cuisine> "Brazilian".

注意:我致力于 RML 和 FnO 技术

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?