假设我有以下情况:
我在网络上的某个地方托管了一些不同的本体文件,如_http://foo1.com/ontolgy1.owl#,_http://foo2.com/ontology2.owl# etc.
我还有一个三重存储,我想根据这样提到的本体文件插入实例:
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个本体文件。
这不是有点令人失望吗?
我是否误解了三重存储和链接数据以及它们如何协同工作?
答案 0 :(得分:2)
应该如此。
我不确定应该是否是正确的术语。 SPARQL查询的语义是查询存储在端点上的特定图中的数据。 IRI或多或少是 opaque 标识符;仅仅因为它们也可能是可以从中检索附加数据的URL,并不强制任何特定系统实际进行这种检索。这样做很容易使查询行为变得不可预测:&#34;这个查询昨天有效,为什么它今天不起作用?哦,远程网站不再可用......&#34;。
让我们说_http://foo2.com/ontolgy2.owl#class2x是在同一本体中定义的_http://foo2.com/ontolgy2.owl#class2的子类。
请记住,由于IRI是不透明的,任何人都可以在任何本体中定义一个术语。对于其他人来说,总是可以出现并对资源说些别的话。您无法跟踪所有这些信息。例如,如果我去写一个本体论,我可以将http://foo2.com/ontolgy2.owl#class2x声明为一个类,并断言它等同于http://dbpedia.org/ontology/人。系统是否应该知道我在其他地方做了什么,即使它确实如此,是否需要从中检索信息?如果我制作了2GB大小的本体怎么办?当然,您的终端无法进行检索,只是为了回答快速查询?
我们可以在这个例子中谈论&#34;链接&#34;数据?因为它似乎 我根本没有联系。它必须在本地导入到 三重商店,然后你可以开始查询。
让我们说如果要对一些描述的复杂数据运行查询 通过20个本体文件,在这种情况下,我必须导入所有20个本体 文件。
通常就是这种情况,关于链接数据的要点是,如果您选择,您可以获得更多信息,并且您不必做同样的事情致力于谈判如何识别该数据中的资源。但是,您可以使用SPARQL中的服务关键字来引用其他端点,并且可以提供一种链接。例如,知道DBpedia有一个SPARQL端点,我可以运行一个包含DBpedia的本地查询,如下所示:
select ?person ?localValue ?publicName {
?person :hasLocalValueOfInterest ?localValue
service <http://dbpedia.org/sparql> {
?person foaf:name ?publicName
}
}
您可以使用多个服务块来聚合来自多个端点的数据;你不仅限于一个人。这看起来很漂亮&#34;链接&#34;对我来说。