我是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,假设您已经有一个要从中查询的实体。虽然在我的情况下,由于我正在尝试查询具有特定名称的人,因此您无需继续操作。 我可能对我正在使用的数据库的内部工作做了一些错误的假设,但我不确定它们是什么。
有什么想法吗?
答案 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
)确实有效,但可能并不符合您的需求。如果你能够以其他方式缩小人们的选择范围,那将会有所帮助。
?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". }
}
上查看
但我不确定你是否可以使用通配符进行搜索。