【问题标题】:Call Java from MarkLogic Xquery module从 MarkLogic Xquery 模块调用 Java
【发布时间】:2019-06-03 23:44:01
【问题描述】:

我有一个复杂的 Java 转换例程,我想从我的 XQuery 模块中调用它。我想直接调用它,而不是使用服务或 http 端点来最小化开销。

这适用于必须将大型几何形状从一个坐标系转换到另一个坐标系(RD 到 ETRS89)的例程。由于这些是更大的 XML 文档的一部分,可能包含几十个这样的形状,我想在我们实际处理文档时在 MarkLogic 中执行此操作。

MarkLogic 文档没有给我任何信息如何实现这样的扩展,只讨论了不适合的 xquery 和 javascript 扩展。

在 XQuery 或 Javascript 中重写例程并不是一个真正的选择,因为它会非常复杂且耗时。

【问题讨论】:

  • 这里的上下文是什么?它是基于用户对 REST 端点的请求吗?还是它是摄取过程的一部分?
  • 上下文:用户上传了一个需要进一步处理的大型 xml 文档。我们使用 schema 和 schematron 对其进行验证。当文档有效时,我们通过提取数据进一步处理它,包括我们想要存储为 cts:region 的 GML,以便我们可以使用地理搜索。但由于它的坐标格式错误(RD,荷兰专有格式),我们需要在存储之前将其转换为 ETRS89,因为 ML 无法处理 RD 坐标。
  • 用户和 MarkLogic 之间是否有 Java 中间层?如果是这样,一种选择是向 ML 发出两个请求。第一个将执行验证和 GML 提取,所有这些都将返回到 Java 层。然后,Java 层可以使用库将 GML 转换为 ETRS89。然后 Java 层会将所有内容发送回 ML,ML 会保留它。或者,您可以让 Java 中间层也执行所有验证,因为它也可以使用模式和 Schematron 轻松验证。

标签: java xquery marklogic


【解决方案1】:

不支持在进程内调用 java 的方法。有相当有效的方法可以调用您可能需要重新考虑的进程外服务。开销主要是延迟。如果您批量转换并保持 Java 服务器运行以避免启动成本,则可以最大限度地减少开销。

可能存在不受支持和/未经测试的方法。 此特定任务可能非常适合本机“用户定义函数 - UDF”接口。这允许将本机代码作为查询的一部分(不是直接从 XQuery)调用,而是作为数据层中的 map-reduce 过程调用。这些函数可以写在一个通过 JNI 调用 java 的 C++“包装器”中——理论上(据我所知,未经测试)。

还有 Java 到 JavaScript 的转换程序,它可能能够生成可在服务器中本地运行的 javascript。 示例:GWT

我一直想尝试自己的一种方法是首先将 Java 转换为 Kotlin(相当简单,通过 IntelliJ 的 J2K 工具实现了大约 80% 的自动化)。
然后可以将 Kotlin 编译为 Javascript。

Kotlin(通过 kotlin native)也可以生成本地可执行文件(但我不相信 UTF 接口所需的共享库。)

【讨论】:

  • MLJAM (developer.marklogic.com/code/mljam) 是一种使用 REST 调用进行通信并通过 BeanShell 保持 Java 上下文活动以减少延迟的工具。一个老歌,但很好。
  • 感谢富有洞察力的 cmets,我们一定会进一步研究这些可能性。
【解决方案2】:

根据您的描述,您似乎正在使用诸如 ruimtelijke plannen 或 omgevingswet 数据之类的东西。 根据您需要对数据执行的操作,您可以使用原始坐标系在 MarkLogic 中使用 RD。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2011-11-23
    相关资源
    最近更新 更多