如何使用维基数据和SPARQL查询人员?

时间:2016-09-29 15:02:20

标签: sparql wikidata

我是SPARQL和Wikidata的新手。我试图让我的用户搜索维基数据 人,仅限人, 我不希望任何结果成为摩托车品牌或其他任何内容。

所以我使用以下查询在here上游戏:

SELECT ?person ?personLabel WHERE {
  ?person wdt:P31 wd:Q5.
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "en".
    ?person rdfs:label ?personLabel .
  }
  FILTER regex(?personLabel, "Albert", "i").
}
LIMIT 10

虽然这最终会返回一个结果,但它并不像我希望的那样快。请注意,如果您使用更大的名称尝试上述查询,它也会超时。

所有示例查询都使用,找到here,假设您已经有一个要从中查询的实体。虽然在我的情况下,由于我正在尝试查询具有特定名称的人,因此您无需继续操作。 我可能对我正在使用的数据库的内部工作做了一些错误的假设,但我不确定它们是什么。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

使用维基数据进行自由文本搜索的问题在于does not have a free text index (yet)。如果没有索引文本搜索,则需要为每个标签尝试匹配,这样效率不高。我无法想出一个搜索" Albert Einstein"并且不会超时。当然,完全匹配(# Loading and parsing data = pd.read_csv('test') data.Start = pd.to_datetime(data.Start, format='%Y-%m-%d %H:%M:%S') data.End = pd.to_datetime(data.End, format='%Y-%m-%d %H:%M:%S') interval = 10 # minutes Start_count = pd.Series(1, index=data.Start) Start_count = Start_count.resample(str(interval)+'t').count() # End_count series doesn't have the same length as Start_count End_count = pd.Series(1, index=data.End) End_count = End_count.resample(str(interval)+'t').count() # This is an ugly way of going around encountered issues and doing what I wanted Span = pd.Series(np.float64( (data.End - data.Start) / np.timedelta64(1,'s') ), index=data.Start) Span_mean = Span.resample(str(interval)+'t').mean() Span_mean = pd.to_timedelta(Span_mean, unit='s') # When merging all series in a dataframe it seems that alignment is properly done new_dataframe = pd.DataFrame(({'Start_count' : Start_count, 'End_count' : End_count, 'Span_avg' : Span_mean})) new_dataframe.fillna(0,inplace=True) new_dataframe.index.rename('Periods',inplace=True) new_dataframe.head() # Shows: End_count Span_avg Start_count Periods 2010-12-12 23:00:00 0.0 00:36:21 1.0 2010-12-12 23:10:00 0.0 00:00:00 0.0 2010-12-12 23:20:00 0.0 02:54:42 1.0 2010-12-12 23:30:00 1.0 07:43:20 1.0 2010-12-12 23:40:00 0.0 05:12:08 3.0 )确实有效,但可能并不符合您的需求。如果你能够以其他方式缩小人们的选择范围,那将会有所帮助。

另一方面,DBpedia(http://dbpedia.org/sparql)有Virtuoso的?person rdfs:label "Albert Einstein"@en .可用,因此在那里工作得非常快(http://yasgui.org/short/HJeZ4kjp):

bif:contains

答案 1 :(得分:4)

您可以尝试使用标签代替过滤器:

SELECT ?item ?itemLabel WHERE {
  ?item wdt:P31 wd:Q5.
  ?item ?label "Einstein"@en .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

Wikidata Query Service

上查看

但我不确定你是否可以使用通配符进行搜索。

相关问题