java - 将 Jena OntModel 与 bnode 同步

标签 java serialization jena ontology

此问题涉及rcreswick关于 Serializing Jena OntModel Changes 的问题。我在两台(或更多)机器上有 Jena 模型,需要通过套接字保持同步。我需要解决的主要问题是模型可能包含匿名节点(bnode),它们可以源自任何模型。

问题:我是否走在正确的轨道上,或者是否有我没有考虑的更好、更稳健的方法?

我可以想到解决这个问题的 3 种方法:

  1. 序列化完整模型:这对于同步小更新来说成本过高。另外,由于任何一台机器上都可能发生更改,因此我不能只用机器 A 的序列化模型替换机器 B 的模型。我需要合并它们。
  2. 序列化部分模型:使用专用模型进行序列化,仅包含需要通过套接字发送的更改。这种方法需要特殊的词汇来表示从模型中删除的语句。据推测,当我将模型从机器 A 序列化到机器 B 时,匿名节点 ID 对于机器 A 来说是唯一的,但可能与机器 B 上创建的匿名节点的 ID 重叠。因此,我必须重命名匿名节点并保留从机器 A 的匿名 id 到机器 B 的 id 的映射,以便正确处理 future 的更改。
  3. 序列化单个语句:这种方法不需要特殊的词汇,但可能不够稳健。除了匿名节点之外,是否还存在我尚未遇到的问题?
  4. 生成全局唯一的 bnode id(新):我们可以通过在 ID 前加上唯一的机器 ID 来为匿名节点生成全局唯一的 ID。不幸的是,我还没弄清楚how to tell Jena to use my ID generator而不是它自己的。这将使我们能够序列化各个语句,而无需重新映射 bnode ID。

这里有一个例子来进一步说明这个讨论。假设我在机器 A 上有一个列表,表示为:


    _:a rdf:first myns:tom
    _:a rdf:rest rdf:nil

我将此模型从机器 A 序列化到机器 B。现在,因为机器 B 可能已经有一个 ID 为“a”的(不相关的)匿名节点,所以我将 ID“a”重新映射到新的 ID“b”:


    _:b rdf:first myns:tom
    _:b rdf:rest rdf:nil

现在机器 A 上的列表发生变化:


    _:a rdf:first myns:tom
    _:a rdf:rest _:b
    _:b rdf:first myns:dick
    _:b rdf:rest rdf:nil

由于机器 B 以前从未遇到过机器 A 的 id 'b',因此它添加了从机器 A 的 id 'b' 到新 id 'c' 的新映射:


    _:b rdf:first myns:tom
    _:b rdf:rest _:c
    _:c rdf:first myns:dick
    _:c rdf:rest rdf:nil

如果有两台以上的机器,问题会更加复杂。例如,如果有第三台机器 C,它可能有自己的匿名节点“a”,该匿名节点与机器 A 的匿名节点“a”不同。因此,机器 B 确实需要保存从每台其他机器的匿名节点 ID 到其本地 ID 的映射,而不仅仅是从一般远程 ID 到本地 ID 的映射。处理传入更改时,必须考虑更改的来源以正确映射 ID。

最佳答案

您可以将自己的三元组添加到模型中吗?如果是这样,我将为每个 bnode 引入一个语句,以 URN 的形式为每个 bnode 提供一个备用公共(public) id。您现在可以开始匹配两个模型之间的 bnode。

无论是否为空白节点,双向同步只能让您到目前为止。如果您试图检测两个模型上的等效并发更改,这样的策略只能帮到您这么多。

这是一个例子。假设您正在创办一家新的草坪护理公司。为了招揽生意,您和您的伴侣去参加本地的户外 Activity ,并尝试预订一些打折的试用预约。你们两个人各拿着一台笔记本电脑,交流并记录任何感兴趣的人。记录有:

address and zip
phone number
appointment dateTime

假设每条记录都作为资源存储在模型中。你可能会遇到丈夫,而你的伴侣可能会遇到同一家庭的妻子。无论您是否巧合地预订了相同的约会日期时间,系统都很难删除重复的条目。无论您为每条记录使用 bnode 还是基于 UUID 的 URI,都不会进行重复数据删除。唯一的希望是,如果您使用某种规范形式的电话号码来合成记录的确定性 URI。

关于java - 将 Jena OntModel 与 bnode 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727449/

相关文章:

java - 修改作为托管属性从另一个托管 Bean 访问的托管 Bean 的私有(private)对象属性

java - Duke CSVReader ArrayIndexOutOfBoundsException

java - jackson 和 Lombok :属性为对象时出现MismatchedInputException

c++ - 如何使用带有非默认构造函数的指针进行 Boost 序列化

c# - C#中序列化派生类的问题

java - SHACL与Jena,如何从形状中得到SPARQL CONSTRUCT后的模型?

java - 耶拿中的 OWL ObjectProperty 定义,未输出域和范围

java - 如何重命名本体的前缀

java - 检索已注册的 JMX mbean 的信息

java - Jersey 无法序列化注释?