以下是我的JSON数据,恰好是维基数据提供的格式,虽然为了清晰起见而大大减少了.
{
"entities": {
"Q200405": {
"id": "Q200405",
"type": "item",
"claims": "Cheese"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在c#中访问这些数据.我的问题是Q200405是动态的 - 它基本上是我正在检索的记录号.例如,另一页可能会给我
{
"entities": {
"Q123456": {
"id": "Q123456",
"type": "item",
"claims": "Lemon"
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我最好的尝试是使用Json.NET(Newtonsoft);
json = "{\"entities\":{\"Q200405\" {\"id\":\"Q200405\",\"type\":\"item\",\"claims\":\"Cheese\"}}}";
var Query = JsonConvert.DeserializeObject<dynamic>(json);
string entities = Query.entities.ToString();
Query = JsonConvert.DeserializeObject<dynamic>(entities);
string entity = Query.Q200405.ToString();
Query = JsonConvert.DeserializeObject<dynamic>(entity);
string id = Query.id.ToString();
string claims = Query.claims.ToString();
Run Code Online (Sandbox Code Playgroud)
这可行,但显然硬编码Query.Q200405.ToString()不是理想的解决方案!我可能不应该做多个Deserialize语句来深入研究数据?
我的问题是将上述JSON格式读入ac#程序的最佳方法是什么?
我想讨论这种类似Siri的服务的第一部分.
理想情况下,我希望能够查询以下内容:
得到这样的结果:
{type:"film"}
{type:"composer"}
{type:"song"}
Run Code Online (Sandbox Code Playgroud)
我什么都不关心,我发现维基百科以外的描述,图像和一般信息完全无用.我将维基数据视为一种元数据服务,它可以为我提供我搜索的文本的语义.
所有数据结构都有"类型"或某种与其含义有关的属性吗?是否有所有类型的列表?对于具有双重含义的实体,如"apple",是否有建议功能?最后,如何发送文本查询并读取响应数据结构的"类型"?
我知道我没有提供任何代码,但我真的无法理解维基数据的API.我到处搜索,所有我找不到的是一些残缺的获取示例,并搞砸了Objective-C HTML解析器.我甚至无法让他们的"示例查询"页面工作,因为我不明白的一些错误.
真的新手不友好,充满了沉重的术语.
我使用KMDb人员ID从wikidata数据库中检索信息.结果是三行,包含三个IMDB代码.如果我看女演员wikidata网页(https://www.wikidata.org/wiki/Q7496795),我可以看到其中只有一个有参考.
我怎样才能只选择这个项目?是否可以将引用显示为sparql查询的输出?
非常感谢
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX v: <http://www.wikidata.org/prop/statement/>
PREFIX pr: <http://www.wikidata.org/prop/reference/>
SELECT ?wikidata ?imdb ?Q ?prop ?value
WHERE {
?wikidata wdt:P345 ?imdb .
?wikidata wdt:P31 wd:Q5 .
?wikidata wdt:P1649 "00003964" . # KMDb person ID
}
LIMIT 10
Run Code Online (Sandbox Code Playgroud) 我是SPARQL和Wikidata的新手。我试图让我的用户搜索Wikidata中的人员,并且仅限人员,我不希望任何结果成为摩托车品牌或任何东西。
所以我在这里玩以下查询:
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
Run Code Online (Sandbox Code Playgroud)
尽管这最终会返回结果,但它几乎不如我希望的那样快。请注意,如果您使用更大的名称尝试上述查询,它也会超时。
在此处找到的所有示例查询都假定您已经有一个要从其查询的实体。就我而言,您什么也没做,因为我正在尝试查询具有特定名称的人。我可能对正在使用的数据库的内部运行方式做出了一些错误的假设,但是我不确定它们到底是什么。
有任何想法吗?
我正在尝试从维基数据中检索一些信息,我发现有趣的是收集声音的别名.例如,Francesco Totti也被称为il Capitano或er Pupone:
我正试图用这个sparql查询检索所有系列的足球运动员:
SELECT ?subject ?nomeLabel ?cognomeLabel ?subjectLabel WHERE {
?subject wdt:P31 wd:Q5.
?subject p:P54 ?team .
?team ps:P54 wd:""" + team_code +""" .
FILTER NOT EXISTS { ?team pq:P582 ?end
}
OPTIONAL{
?subject wdt:P735 ?nome .
?subject wdt:P734 ?cognome .
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "it". }
}
ORDER BY (?cognomeLabel)
Run Code Online (Sandbox Code Playgroud)
如何修改我的查询以获取别名?谢谢
考虑以下片段
ASK WHERE { wd:Q734774 wdt:P31 wd:Q3918. }
Run Code Online (Sandbox Code Playgroud)
这在WikiData中可以正常工作。我想在此代码段中使用一些路径语法。具体来说,我想限制路径中使用“ wdt:P31”的次数。根据准则,这应该是正确的语法:
ASK WHERE { wd:Q734774 wdt:P31{,3} wd:Q3918. }
Run Code Online (Sandbox Code Playgroud)
但这给了我奇怪的错误信息。有任何想法吗?
我想检索 Wikimedia Category 的成员American rock singers
。我必须使用维基数据,它告诉我用P31
用Q4167836
。下面的查询仅返回有关“类别”页面的信息,而不返回有关其成员的信息。
还有其他方法可以检索维基媒体类别的成员吗?我还尝试使用术语dcterms:subject
,我在 DBpedia 中成功使用了该术语,但在 Wikidata 中,查询返回空结果。
prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wd: <http://www.wikidata.org/entity/>
prefix wikibase: <http://wikiba.se/ontology#>
prefix bd: <http://www.bigdata.com/rdf#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?subject ?predicate ?object ?objectLabel WHERE {
?subject ?predicate ?object ; wdt:P31 wd:Q4167836 ;
rdfs:label "Category:American rock singers"@en
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .}
}
Run Code Online (Sandbox Code Playgroud)
在这里试试
在检查官方示例查询“大陆、国家、地区和首都”的结果(在https://query.wikidata.org/ 上,为了您的方便,这里仅限于德国:链接),我注意到德国联邦的一些首都状态丢失。例如威斯巴登作为黑森州的首府。我注意到与其他一些城市相比,威斯巴登是 的一个实例big city
,但不是city
(参见https://www.wikidata.org/wiki/Q1721)。我能够还包括那些的子类城市来缓解这一问题city
,通过改变线路17 ?city wdt:P31/wdt:P279? wd:Q515
。
仍然失踪的四个城市之一是萨克森-安哈尔特州的首府马格德堡。
诊断查询
SELECT ?cityLabel ?props
WHERE {
?city wdt:P31 ?props.
FILTER(?city = wd:Q1733 || ?city = wd:Q1726).
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
Run Code Online (Sandbox Code Playgroud)
显示 Magdeburg 甚至不是 的一个实例city
,尽管它显然是根据其 Wikidata 页面https://www.wikidata.org/wiki/Q1733。
我是 Wikidata 和 SPARQL 的新手。然而,这对我来说似乎是错误的。我该怎么做才能获得德国联邦州的所有首都?这种行为的原因是什么?
我正在尝试为一组担任过政治职务的人(爱丁堡大学校友)返回结果。我想返回所担任职位的标题标签,以及每个职位的开始和结束日期,许多人担任多个职位。如果这个人只担任一个职位,我似乎能够找到其中一个,或者可以让它发挥作用,但无法让两者走到一起,因为有多个办公室。
我当前的查询版本如下。这将为我提供开始和结束日期,但如果政治办公室(例如英国 [x] 议会成员)将返回标签,而不是标签, ?officeLabel 返回一个值,例如:statement/Q4668868-E3734C7D-40F0-4D4A-8208-E3D6B8C944CB
SELECT DISTINCT ?alumni ?fullName ?roleLabel ?officeLabel ?start ?end WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?alumni wdt:P69 wd:Q160302.
?alumni rdfs:label ?fullName.
?alumni wdt:P106 ?role.
#Use Values to separate out politicians - Q82955
VALUES (?role) {
(wd:Q82955)
}
#Select only where position of office is stated but make dates optional
?alumni p:P39 ?office.
OPTIONAL { ?office pq:P580 ?start. }
OPTIONAL { ?office pq:P582 ?end. }
FILTER(LANGMATCHES(LANG(?fullName), "en"))
FILTER(NOT EXISTS { FILTER(LANGMATCHES(LANG(?fullName), "en-ca")) …
Run Code Online (Sandbox Code Playgroud) 我正在按照这些说明提交 SPARQL 查询,更喜欢 POST 方法,因为查询可能很长。但即使 GET 有效,它似乎也失败了 - 有什么方法可以使 POST 查询有效?
sparql = <<END
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:Q146.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
END
# Fails with 405 Not writable
resp = Excon.post('https://query.wikidata.org/sparql', body: "query=#{URI::encode(sparql)}")
puts resp.status, resp.body
# Works with 200
resp = Excon.get("https://query.wikidata.org/sparql?query=#{URI::encode(sparql)}")
puts resp.status, resp.body
Run Code Online (Sandbox Code Playgroud)
我也试过发送"Content-Type" => "application/x-www-form-urlencoded"
,但没有运气。
wikidata ×10
sparql ×8
json ×2
mediawiki ×2
wikidata-api ×2
c# ×1
categories ×1
member ×1
properties ×1
qualifiers ×1
ruby ×1
wikimedia ×1