代码之家  ›  专栏  ›  技术社区  ›  whitefang1993

三重存储如何使用链接数据?

  •  0
  • whitefang1993  · 技术社区  · 9 年前

    假设我有以下场景:

    我有一些不同的本体文件托管在不同的域上,比如_http://foo1.com/ontolgy1.owl#, _http://foo2.com/ontology2.owl#等

    我还有一个三重存储,我想在其中插入基于本体文件的实例,如下所示:

    INSERT DATA
    {
      <http://foo1.com/instance1> a <http://foo1.com/ontolgy1.owl#class1>.
      <http://foo2.com/instance2> a <http://foo2.com/ontolgy2.owl#class2>.
      <http://foo2.com/instance2x> a <http://foo2.com/ontolgy2.owl#class2x>.
    }
    

    让我们这么说吧_http://foo2.com/ontolgy2.owl#class2x是的子类_http://foo2.com/ontolgy2.owl#class2在同一本体内定义。

    在插入之后,如果我运行这样的SPARQL查询:

    select ?a
    where 
    {
      ?a rdf:type ?type.
      ?type  rdfs:subClassOf* <http://foo2.com/ontolgy2.owl#class2> .
    }
    

    结果将是:

    <http://foo2.com/instance2>
    

    而不是:

    <http://foo2.com/instance2>
    <http://foo2.com/instance2x>
    

    正如它应该的那样。发生这种情况是因为本体文件_http://foo2.com/ontolgy2.owl#未导入三重存储。

    我的问题是:

    我们可以在这个例子中讨论“链接”数据吗?因为在我看来,它根本没有联系。它必须在本地导入到三重存储中,然后才能开始查询。

    比方说,如果您想对一些由20个本体文件描述的复杂数据运行查询,那么需要导入所有20个本体文档。

    这不是有点令人失望吗?

    我是否误解了三重存储和链接数据以及它们是如何协同工作的?

    1 回复  |  直到 9 年前
        1
  •  2
  •   Joshua Taylor    9 年前

    正如它应该的那样。

    我不确定 应该 是这里的正确术语。SPARQL查询的语义是查询存储在端点处的特定图中的数据。IRI或多或少 不透明的 标识符;仅仅因为它们也可能是可以从中检索额外数据的URL,并不要求任何特定系统实际执行这种检索。这样做很容易使查询行为变得不可预测:“这个查询昨天起作用了,为什么今天不起作用?噢,远程网站不再可用……”。

    让我们这么说吧_http://foo2.com/ontolgy2.owl#class2x是的子类_http://foo2.com/ontolgy2.owl#class2在同一本体内定义。

    记住,由于IRI是不透明的, 任何人 可以在任何本体中定义术语。其他人总是有可能来谈论资源的其他情况。你无法追踪所有这些信息。例如,如果我去写一个本体,我可以声明http://foo2.com/ontolgy2.owl#class2x作为一个类,并断言它等价于http://dbpedia.org/ontology/Person.系统是否应该有某种方式知道我在其他地方做了什么,即使它做了,是否应该要求它去那里检索信息?如果我制作了一个2GB大小的本体呢?当然,你的端点不能仅仅为了回答一个快速的查询就去检索它吗?

    我们可以在这个例子中讨论“链接”数据吗?因为它似乎 我认为它根本没有联系。它必须在本地导入到 三重存储,然后可以开始查询。

    比方说,如果要对描述的一些复杂数据运行查询 通过20个本体文件,在这种情况下,我必须导入所有20个本体 文件夹。

    通常情况是这样的,关于链接数据的关键是你有一种方法来获取更多信息 如果你选择 ,并且您不必在协商如何识别数据中的资源时做那么多工作。然而,你 可以 使用 服务 关键字来引用其他端点,并且可以提供一种类型的链接。例如,知道DBpedia有一个SPARQL端点,我可以运行一个本地查询,将DBpedia与如下内容结合起来:

    select ?person ?localValue ?publicName {
      ?person :hasLocalValueOfInterest ?localValue
      service <http://dbpedia.org/sparql> {
        ?person foaf:name ?publicName 
      }
    }
    

    您可以使用多个 服务 用于聚合来自多个端点的数据的块;你不限于一个。这似乎与我“有关联”。