Apache Jena查询:太复杂或太复杂

时间:2017-12-18 08:48:01

标签: query-optimization sparql jena wikidata

我的数据库中有以下数据:

@prefix geo: <http://www.opengis.net/ont/geosparql#> .
@prefix p: <http://www.wikidata.org/prop/> .
@prefix ps: <http://www.wikidata.org/prop/statement/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix wd: <http://www.wikidata.org/entity/> .
@prefix wds: <http://www.wikidata.org/entity/statement/> .
@prefix wdt: <http://www.wikidata.org/prop/direct/> .

wd:Q4472 rdfs:label
        "Aulesti"@en ;
    p:P625 wds:q4472-589D5F6B-FC8C-4584-9546-89A2930F141A ;
    wdt:P625 "Point(-2.5628139 43.296423)"^^geo:wktLiteral .

wds:q4472-589D5F6B-FC8C-4584-9546-89A2930F141A ps:P625 "Point(-2.5628139 43.296423)"^^geo:wktLiteral .

如您所见,位置信息存在两次。它是来自维基数据的样本,经常发生这种情况。但有时只有其中一个存在,而且不知道是哪一个。

通常情况下,我会使用以下查询收集它们:

PREFIX wdt: <http://www.wikidata.org/prop/direct/> 
PREFIX p: <http://www.wikidata.org/prop/> 
PREFIX ps: <http://www.wikidata.org/prop/statement/> 

SELECT ?place ?coord WHERE { 
  ?place wdt:P625 ?coord
  OPTIONAL {
    ?place p:P625 ?itemLocation .
    ?itemLocation ps:P625 ?coord .
  }
}

作为一个人,我会选择最短的路径,当没有?coord时,我必须走?itemLocation的长路。

耶拿使用哪种策略?

从两种不同的关系中获取相同结果值是否合适?

我应该查询两次吗?

你还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

这取决于您想要的数据。我认为如果你想要最相关的值,你应该只使用?place wdt:P625 ?coord。请参阅以下说明。

前缀wdt代表direct relationship PREFIX wdt: <http://www.wikidata.org/prop/direct/>;这与维基数据代表知识的方式有关。 Wikidata最初不是RDF格式,因此,应该调整一些建模方法以在RDF中表示这些数据。

在某种意义上使用的method类似于RDF具体化,您可能需要将(元)信息添加到s p o形式的语句(三元组)中,例如,源,作者,陈述时间等。维基数据需要一种方法来建立多值属性的多个值之间的排序。例如,美国的人口可能在2008年发行,例如290万和2016年至310亿。因此,人口属性可能有两个不同的值。维基数据提供ranking,在查询直接值时更喜欢2016年值(310)和2008(290)值。当您使用带有属性名称的wdt前缀时,您将查询直接值,这些值在其他值之间具有最高排名(您应该阅读this)。否则(p前缀),您与自定义的维基数据模型匹配以表示RDF中的数据,请参阅示例this query

使用wdt前缀查询属性时,您将获得两项好处;首先,您跳过详尽的语法来访问属性作为主题,并为每个属性获得最佳排名值。我认为这也是表现明智的决定。