让我说,我有以下场景:
我有一些不同的本体文件托管在web上的不同领域,如_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个本体文件。
这是不是有点令人失望?
我是否误解了三重存储和链接数据以及它们是如何协同工作的?
发布于 2016-04-18 15:55:23
它应该是的。
我不确定这是否应该是正确的术语。SPARQL查询的语义是查询存储在端点上的特定图中的数据。IRIs或多或少是不透明的标识符;仅仅因为它们也可能是可以检索额外数据的URL,并不意味着任何特定的系统都有义务进行这种检索。这样做很容易使查询行为不可预测:“这个查询昨天成功了,为什么今天不能工作?哦,远程网站不再可以使用…了。”。
假设_http://foo2.com/ontolgy2.owl#class2x是在同一本体中定义的_http://foo2.com/ontolgy2.owl#class2的子类。
记住,因为IRIs是不透明的,任何人都可以在任何本体中定义术语。对于其他人来说,总是有可能对资源说点别的。你无法追踪所有这些信息。例如,如果我编写了一个本体,我可以将http://foo2.com/ontolgy2.owl#class2x声明为一个类,并断言它等同于http://dbpedia.org/ontology/Person。系统是否应该知道我在其他地方做了什么,即使这样做了,是否应该要求它去检索信息呢?如果我创建了一个大小为2GB的本体怎么办?当然,您的端点不可能仅仅为了回答快速查询而去检索它吗?
在这个例子中,我们能谈谈“链接”数据吗?因为在我看来,它完全没有联系。它必须在本地导入到一个三重存储中,然后您可以开始查询。 如果要对20个本体文件描述的复杂数据运行查询,那么在本例中,我必须导入所有20个本体文件。
这通常是这样的,而关于链接数据的要点是,如果您愿意,您可以获得更多的信息,并且您不必在协商如何确定数据中的资源方面做那么多的工作。但是,您可以在SPARQL中使用服务关键字来引用其他端点,这可以提供一种类型的链接。例如,知道DBpedia有一个SPARQL端点,我可以运行一个本地查询,该查询将DBpedia与以下内容结合在一起:
select ?person ?localValue ?publicName {
?person :hasLocalValueOfInterest ?localValue
service <http://dbpedia.org/sparql> {
?person foaf:name ?publicName
}
}您可以使用多个服务块从多个端点聚合数据;您不仅限于一个端点。这对我来说似乎很“有关联”。
https://stackoverflow.com/questions/36695002
复制相似问题