此问题涉及rcreswick关于 Serializing Jena OntModel Changes 的问题。我在两台(或更多)机器上有 Jena 模型,需要通过套接字保持同步。我需要解决的主要问题是模型可能包含匿名节点(bnode),它们可以源自任何模型。
问题:我是否走在正确的轨道上,或者是否有我没有考虑的更好、更稳健的方法?
我可以想到解决这个问题的 3 种方法:
- 序列化完整模型:这对于同步小更新来说成本过高。另外,由于任何一台机器上都可能发生更改,因此我不能只用机器 A 的序列化模型替换机器 B 的模型。我需要合并它们。
- 序列化部分模型:使用专用模型进行序列化,仅包含需要通过套接字发送的更改。这种方法需要特殊的词汇来表示从模型中删除的语句。据推测,当我将模型从机器 A 序列化到机器 B 时,匿名节点 ID 对于机器 A 来说是唯一的,但可能与机器 B 上创建的匿名节点的 ID 重叠。因此,我必须重命名匿名节点并保留从机器 A 的匿名 id 到机器 B 的 id 的映射,以便正确处理 future 的更改。
- 序列化单个语句:这种方法不需要特殊的词汇,但可能不够稳健。除了匿名节点之外,是否还存在我尚未遇到的问题?
- 生成全局唯一的 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/