Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Jena模型与B节点同步_Java_Serialization_Jena_Ontology - Fatal编程技术网

Java 将Jena模型与B节点同步

Java 将Jena模型与B节点同步,java,serialization,jena,ontology,Java,Serialization,Jena,Ontology,这个问题涉及到的问题是。我有两台(或更多)机器上的Jena型号,需要通过套接字保持同步。我需要解决的主要问题是,这些模型可能包含匿名节点(bNode),它们可以起源于任何一个模型 问题< /强>:我是在正确的轨道上,还是有一个更好、更健壮的方法,我没有考虑? 我可以想出3种解决这个问题的方法: 序列化整个模型:这对于同步小型更新来说代价高昂。另外,由于更改可能发生在任何一台机器上,我不能用机器A的序列化模型替换机器B的模型。我需要合并它们 序列化部分模型:使用只包含需要通过套接字发送的更改的专

这个问题涉及到的问题是。我有两台(或更多)机器上的Jena型号,需要通过套接字保持同步。我需要解决的主要问题是,这些模型可能包含匿名节点(bNode),它们可以起源于任何一个模型

<强>问题< /强>:我是在正确的轨道上,还是有一个更好、更健壮的方法,我没有考虑?

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

  • 序列化整个模型:这对于同步小型更新来说代价高昂。另外,由于更改可能发生在任何一台机器上,我不能用机器A的序列化模型替换机器B的模型。我需要合并它们
  • 序列化部分模型:使用只包含需要通过套接字发送的更改的专用模型进行序列化。这种方法需要特殊的词汇表来表示从模型中删除的语句。假设,当我将模型从机器A序列化到机器B时,匿名节点ID对于机器A是唯一的,但可能与在机器B上创建的匿名节点的ID重叠。因此,我必须重命名匿名节点,并保持从机器A的anon ID到机器B的ID的映射,以便正确处理将来的更改
  • 序列化单个语句:这种方法不需要特殊的词汇表,但可能不够健壮。除了匿名节点之外,我还没有遇到其他问题吗
  • 生成全局唯一的bnode ID(新):我们可以通过在ID前面加上唯一的机器ID来为匿名节点生成全局唯一的ID。不幸的是,我还没有找到它自己的ID。这将允许我们序列化单个语句,而无需重新映射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的形式为每个节点提供一个备用公共id。现在可以开始在两个模型之间匹配B节点

    不管节点是否为空,双向同步只会让你达到目前为止。如果您试图在两个模型上检测等效的并发更改,那么像这样的策略只会让您走到这一步

    这里有一个例子。比如说,你正在开一家新的草坪护理公司。为了招揽生意,你和你的搭档去当地的户外活动,试着预订一些打折的试用预约。你们两个,每个人都带着一台笔记本电脑,和任何感兴趣的人交往并记录下来。记录如下:

    address and zip
    phone number
    appointment dateTime
    

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

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

    不管节点是否为空,双向同步只会让你达到目前为止。如果您试图在两个模型上检测等效的并发更改,那么像这样的策略只会让您走到这一步

    这里有一个例子。比如说,你正在开一家新的草坪护理公司。为了招揽生意,你和你的搭档去当地的户外活动,试着预订一些打折的试用预约。你们两个,每个人都带着一台笔记本电脑,和任何感兴趣的人交往并记录下来。记录如下:

    address and zip
    phone number
    appointment dateTime
    

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

    谢谢您的回复!我们通过将每台机器限制在本体的特定部分来处理这个同构问题。回到您的示例,人员A可能处理客户列表,而人员B负责管理库存。我们的域还为相关实体定义了明确的唯一ID。问题是,人员A可能会将一个列表节点添加到客户列表中,该节点恰好与肥料供应商列表中的bnode id重叠。感谢您的回复!我们通过将每台机器限制在本体的特定部分来处理这个同构问题。回到你的例子,体育