使用独立应用程序将数据添加到 HTTPRepository 时出现 RDF4J RIO UnsupportedRDFormatException

2024-03-20

我有一个HTTPRepository使用存储库的 URL 进行初始化。我用一个RepositoryConnection检索(天气)数据并将其添加到存储库。从 Web 服务检索数据,然后将其转换为 RDF 语句,并添加到存储库中。这是由独立应用程序定期完成的。

当我在 IntelliJ 中运行此应用程序时,一切正常。

为了在服务器上运行此应用程序,我创建了一个 jar 文件(包含所有依赖项)。应用程序按预期启动并且能够retrieve来自存储库的数据。

但是,当应用程序尝试write数据到存储库我得到一个UnsupportedRDFormatException:

org.eclipse.rdf4j.rio.UnsupportedRDFormatException: Did not recognise RDF format object BinaryRDF (mimeTypes=application/x-binary-rdf; ext=brf)
    at org.eclipse.rdf4j.rio.Rio.lambda$unsupportedFormat$0(Rio.java:568) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at java.util.Optional.orElseThrow(Optional.java:290) ~[na:1.8.0_111]
    at org.eclipse.rdf4j.rio.Rio.createWriter(Rio.java:134) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.rio.Rio.write(Rio.java:371) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.rio.Rio.write(Rio.java:324) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.repository.http.HTTPRepositoryConnection.addModel(HTTPRepositoryConnection.java:588) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.repository.http.HTTPRepositoryConnection.flushTransactionState(HTTPRepositoryConnection.java:662) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.repository.http.HTTPRepositoryConnection.commit(HTTPRepositoryConnection.java:326) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.repository.base.AbstractRepositoryConnection.conditionalCommit(AbstractRepositoryConnection.java:366) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at org.eclipse.rdf4j.repository.base.AbstractRepositoryConnection.add(AbstractRepositoryConnection.java:431) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at nl.wur.fbr.data.weather.WeatherApp.retrieveData(WeatherApp.java:122) ~[weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at nl.wur.fbr.data.weather.WeatherData$WeatherTask.run(WeatherData.java:105) [weatherData-1.0-SNAPSHOT-jar-with-dependencies.jar:na]
    at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.8.0_111]
    at java.util.TimerThread.run(Timer.java:505) [na:1.8.0_111]

发生错误的源码是:

    public void retrieveData(){
        logger.info("Retrieving data for weather for app: "+ID+" ");
        RepositoryConnection connection = null;
        ValueFactory vf = SimpleValueFactory.getInstance();
        try {
            connection = repository.getConnection();

            // Retrieving the locations from the repository (no problem here).
            List<Location> locations = this.retrieveLocations(connection);
            List<Statement> statements = new ArrayList<>();

            // Retrieving weather data from each location and transforming it to statements.
            for(Location location : locations){
                List<Weather> retrievedWeather = weatherService.retrieveWeatherData(location.name,location.latitude,location.longitude);
                for(Weather weather : retrievedWeather){
                    BNode phenomenon = vf.createBNode();
                    statements.add(vf.createStatement(location.ID,WEATHER.HAS_WEATHER,phenomenon,rdfStoreGraph));
                    statements.addAll(weather.getStatements(phenomenon,vf,rdfStoreGraph));
                    statements = this.correctOMIRIs(statements,vf);
                }
            }

            // Adding data retrieved from the weather API
            // This is where the exception happens.
            connection.add(statements,rdfStoreGraph);

        } catch (Exception e) {
            logger.error("Could not retrievedata for weather app: '"+ID+"' because no monitor locations could be found.",e);
        } finally {
            if(connection != null){
                connection.close();
            }
        }
    }

The HTTPRespository初始化如下:

        repository = new HTTPRepository(rdfStore.toString());
        ((HTTPRepository)repository).setPreferredRDFFormat(RDFFormat.BINARY);
        ((HTTPRepository)repository).setPreferredTupleQueryResultFormat(TupleQueryResultFormat.BINARY);

我尝试将格式更改为TURTLE。但这没有什么区别。

你能告诉我如何解决这个问题吗?

注意。 RDF4J 服务器和库的版本都是 2.0.1 (rdf4j)。


为了在服务器上运行此应用程序,我创建了一个 jar 文件(包含所有依赖项)。

你的问题是:你创建了一个“fat jar”,并且可能没有正确合并 SPI 注册表文件。

RDF4J 的 Rio 解析器(以及其他几个模块)使用 Java 的服务提供者接口 (SPI) 机制来注册自身。该机制依赖于一个文本文件META-INF\services在包含每个解析器实现的完全限定名称的 jar 文件中。

当您合并 jar 时,问题就出现了:每个 Rio 解析器 jar 都有一个名称相同但内容不同的注册表文件。如果您使用诸如 Maven 程序集插件之类的东西来创建 fat jar,则每个注册表文件都会被下一个注册表文件覆盖。结果是,最后,RDF4J 只能找到一个解析器 - 其注册表文件最后添加到 fat jar 中的那个解析器。

解决方案是根本不创建 fat jar,或者如果必须的话,使用不同的技术来创建它,这会合并注册表文件而不是覆盖它们。这Maven 阴影插件 https://maven.apache.org/plugins/maven-shade-plugin/为此有一个很好的配置选项:服务资源转换器 https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用独立应用程序将数据添加到 HTTPRepository 时出现 RDF4J RIO UnsupportedRDFormatException 的相关文章

随机推荐

  • 远程注册

    我知道关于远程注册表访问已经讨论过几次 但我找不到任何关于如何实现这一点的好例子 我确实找到了http www codeproject com KB cs cpimpersonation1 aspx http www codeproject
  • 如何拦截Hibernate生成的SQL?

    对于一个像老大哥一样工作的安全系统 比如受监视的强制访问控制 我们必须拦截并处理 hibernate 生成的所有 select 语句 我们将用户 时间戳和 sql 选择存储在数据库中 以便使用其他工具进行一些分析 这些信息可以确定用户试图查
  • SignalR WebRTC WebSocket 已处于 CLOSING 或 CLOSED 状态

    我想测试运行 SignalR 和 WebRTC 的最简单实现 我将代码托管在https github com foyzulkarim WebRtc https github com foyzulkarim WebRtc 我制作了两个不同的文
  • 在 AngularJS 中集成 jQuery 插件的正确方法

    我想知道将 jQuery 插件集成到我的 Angular 应用程序中的正确方法是什么 我找到了几个教程和截屏视频 但它们似乎适合特定的插件 例如 http amitgharat wordpress com 2013 02 03 an app
  • 优化 iPhone / iPod touch 上的二进制应用程序大小

    我知道用户只能通过 3G 下载最多 20MB 而我的构建 发布 iphoneos 显示我的应用程序为 26MB 我正在链接到 Three20 iPhone 框架 这是提交到 App Store 时计入 20MB 最大值的最终大小吗 我能做些
  • Angular 2 中的条件验证

    Angular 2 中的验证非常简单 这非常棒 然而 如果选择了其他字段 如何将必填字段设置为可选字段 这是我的规则 this contractsFilter this fb group selectedContractType Valid
  • 如何从url中提取域名?

    如何使用 bash 从 url 中提取域名 喜欢 http example com http example com 到 example com 必须适用于任何 TLD 而不仅仅是 com 您可以使用简单的AWK方式提取域名 如下所示 ec
  • 如何将整数放入数字数组[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想将像 123456 这样的数字放入数字数组中 您能给我一个关于该过程的提示吗 我可以定义一个元素数量未知的数组吗 首先计算数字的个数
  • UWP 应用程序 WebView 泄漏内存,无法清除图像

    Problem WebView 加载图像后不释放内存 如果所有 WebView 实例都被销毁几秒钟 内存似乎会被释放 我们从 XAML 树中删除并清除了代码中的所有引用 我们在调试器中检查了当时所有实例都已释放 这个解决方案是有问题的 因为
  • 变量重定义,嵌入式c

    我正在开发一个嵌入式 c 项目 并且遇到全局变量重新定义的问题 我已将函数声明和定义分成几个 h 和 c 文件 其中许多函数需要访问全局变量 这些变量在 global vars h 中定义 因此 在头文件的开头 ifndef define
  • 在 C++11 中从 C++17 重新实现 std::map::try_emplace() ?

    std map try emplace http en cppreference com w cpp container map try emplace看起来非常方便和高效 但它仅在 C 17 中可用 是否可以在 C 11 中重新实现它 t
  • webpack-dev-server 断开连接并尝试重新连接...垃圾邮件

    我刚刚完成了我正在做的一个有角度的项目 但是我 注意到控制台中的某些内容 如果是的话我很想隐藏它 可能只是为了保持一切整洁 这是 webpack dev server 模块不断断开连接并尝试重新连接 并向我的控制台日志发送垃圾邮件 像这样
  • 使用“自定义用户模型”删除“webhook”错误(Django)

    我正在尝试配置 Django Stripe 订阅 现在尝试设置 webhook 以通过以下代码创建新的客户数据 views py import stripe from django conf import settings from dja
  • 如何使用 php cURL 下载文件并将其保存到本地路径

    我有一个网址如下 www domain com file asp File peoples csv 在浏览器中点击此 URL 时会强制下载文件 但我想使用 CURL 在本地路径上下载此文件 有什么办法吗 谢谢帮助 好的 找到解决方案了 分享
  • VIM 恢复上次搜索模式

    我重新映射 and 查找文件中的上一个和下一个模式 映射如下 nmap section
  • 获取多个元素的引用

    我有一堆动态创建的输入字段 tr td td tr
  • 快速可靠地查明源代码文件是否实现接口的方法

    给定一个java源代码文件 有什么快速可靠的方法来查明它是否实现了给定的接口 一种可靠的方法是将文件解析为语法树 使用例如 Eclipse 的 ASTNode 类 并查找正确的节点 一种快速的方法是查找带有 implements 的行 剔除
  • 如何在不使用 go-flutter 的情况下在 flutter 桌面中使用 image_picker 插件

    我正在尝试在我的 flutter 桌面项目中使用 image picker 插件 但我认为这个插件没有与 Windows 桌面应用程序一起使用的实现 有人有解决办法吗 Ps 我想使用 go flutter 和悬停 有两种选择 实施适用于 W
  • 复制 Magento 站点

    复制 Magento 网站有多容易 有多难 我的公司使用 Magento 为客户开发了一个英国网站 事实证明 这很受欢迎 因此客户现在要求制作该网站的美国版本 据我所知 该网站将 99 相同 只是指向不同的数据库 针对不同的产品 也许还有一
  • 使用独立应用程序将数据添加到 HTTPRepository 时出现 RDF4J RIO UnsupportedRDFormatException

    我有一个HTTPRepository使用存储库的 URL 进行初始化 我用一个RepositoryConnection检索 天气 数据并将其添加到存储库 从 Web 服务检索数据 然后将其转换为 RDF 语句 并添加到存储库中 这是由独立应