我有一个大约36 GB的json文件(来自wikidata),我希望更有效地访问它.目前我在C++中使用rapidjsons SAX风格的API - 但解析整个文件需要我的机器大约7415200毫秒(= 120分钟).我想根据json对象内部的两个主键之一('name'或'entity-key' - >'Stack Overflow'或'Q549037')访问此文件中的json对象.这意味着我必须在最坏的情况下解析当前的整个文件.
所以我想到了两种方法:
ftell()
文件中的位置构建某种索引.构建索引应该花费大约120分钟(就像现在解析一样),但访问速度应该更快
std::unorderedmap
(可能再次遇到内存问题)这样的问题最好的做法是什么?我应该遵循哪种方法?还有其他想法吗?
我是wikidata的新手,我不知道何时应该使用->
wdt前缀(http://www.wikidata.org/prop/direct/)
当我应该使用->
p前缀(http://www.wikidata.org/prop/)。
在我的sparql查询中。有人可以解释这些含义是什么吗?有什么区别?
我想将属性实例添加到此示例查询中,以仅获取作为人类实例的项目。
这是示例查询:
SELECT ?entityLabel (YEAR(?date) as ?year)
WHERE
{
BIND(MONTH(NOW()) AS ?nowMonth)
BIND(DAY(NOW()) AS ?nowDay)
?entity wdt:P569 ?date .
FILTER (MONTH(?date) = ?nowMonth && DAY(?date) = ?nowDay)
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
}
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
这是我使用属性实例调整后的版本:
SELECT ?entityLabel (YEAR(?date) as ?year)
WHERE
{
?entity wdt:P31 wd:Q5 .
BIND(MONTH(NOW()) AS ?nowMonth)
BIND(DAY(NOW()) AS ?nowDay)
?entity wdt:P569 ?date .
FILTER (MONTH(?date) = ?nowMonth && DAY(?date) = ?nowDay)
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
}
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
但我也只添加了一行,现在我得到了查询超时。有谁知道我如何云改进我的查询,以便我不会超时。
维基数据有一个名为智能手机模型的项目.
我想得到它的所有实例.
问题:如何使用实时服务器以编程方式获取实例的标识符?
最好不要包含在WhatLinksHere中显示但在"Wikidata:"命名空间而不是主命名空间中的误报.
如何从维基数据ID(例如:Q19675)获取维基百科页面(使用特定语言,比如法语)?这个问题似乎很明显,但奇怪的是,我在网上找不到任何内容.我正在寻找一个url命令,我可以使用请求Python模块,如:
url = "https://www.wikidata.org/w/api.php?action=some_method&ids=Q19675"
r = requests.post(url, headers={"User-Agent" : "Magic Browser"})
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
此页面: http: //wikidata.dbpedia.org/downloads/20160111/ 有一个名为 wikidatawiki-20160111-page-ids.ttl.bz2 的转储,其中包含 Wikidata id 到他们所谓的 wikipage id。不过,维基页面 ID 似乎与维基百科页面 ID 不同。
例如德国:
所以基本上这个转储将 Q183 映射到 322,而我需要将 Q183 映射到 11867。
作为参考:https://en.wikipedia.org/w/index.php? title=Germany&curid=11867 URL 中的 curid 代表维基百科页面 id。
是否有任何具有维基数据 ID 和维基百科页面 ID 的等效转储文件?(我不想使用 API 并像下面这样一一循环我的维基百科页面 id:https://en.wikipedia.org/w/api.php ?action=query&prop=pageprops&format=xml&pageids=11867 )
编辑:我不确定 waht 到底是 wikipage id,但也许在我在问题中提到的转储顶部有一个 wikipageId 到 Wikipedia pageid 映射文件。
如何查询维基数据以获取标签包含单词的所有项目?我尝试了这个,但没有奏效; 它什么也没找到.
SELECT ?item ?itemLabel WHERE {
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en".
?item rdfs:label ?itemLabel.
}
FILTER(CONTAINS(LCASE(?itemLabel), "keyword"))
}
LIMIT 1000
Run Code Online (Sandbox Code Playgroud) 我的问题是我如何提取所有属性以及各自的标签,这些标签也是在wikidata网页上呈现的,最好是通过SPARQL.
以wikidata上的Google条目为例.对于物业P414(证券交易所)或P159,有像P969(位于街道地址)的子属性.一旦您查询 wbgetentities
为qualifieres,它们就会显示出来.问题wbgetentities
是缺少标签.我wdt:P17 => country => United States of America
使用以下SPARQL查询获得所需的输出(例如):
SELECT ?prop_id ?prop_label ?prop_val_label WHERE {
VALUES (?company) {
(wd:Q95)
}
?company ?prop_id ?company_item.
?wd wikibase:directClaim ?prop_id.
?wd rdfs:label ?prop_label.
OPTIONAL {
?company_item rdfs:label ?prop_val.
FILTER((LANG(?prop_val)) = "en")
}
BIND(COALESCE(?prop_val, ?companyItem) AS ?prop_val_label)
FILTER((LANG(?prop_label)) = "en")
}
Run Code Online (Sandbox Code Playgroud)
但这些"子属性"缺失,因为它们不是直接索赔.要提取单个语句限定符,我可以这样做:
SELECT ?company ?hq ?country WHERE {
wd:Q95 p:P159 ?company.
OPTIONAL {
?company ps:P159 ?hq.
?company pq:P17 ?country.
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是,是否有办法将所有内容组合到一个查询中?
我正在解析Wikidata JSON数据集以收集历史数据。到目前为止,我还没有找到正确的格式将它们存储在PHP / MySQL中(通过Doctrine)。
在过去的几千年中,DateTime似乎可以正常工作,但是我不想将我的应用程序局限于此。完全有可能必须处理Universe的start time
属性。此外,我还想存储数据的精度,因为我们可能知道一个人的出生年份和另一个人的确切分钟。(编辑:就目前而言,日期就足够了,我可以没有时间生活,我的例子被夸大了。不过,我有时知道确切的日期,有时甚至是月份甚至年份。)
我考虑过要为日期创建自己的类(我不打算计算时差或类似的东西),但我也不想重新发明轮子。
令人遗憾的是,某些搜索引擎以及此处的搜索结果都令人...目结舌。
您可以分享任何想法或经验吗?
抱歉,如果我的英语不好,但我真的没有任何地方可以用我的母语问这个问题。我一直在尝试为 Wikidata 创建 SPARQL 查询,该查询应该创建 1925-1950 年间创作的所有恐怖小说、作者姓名以及图片(如果有)的列表:
SELECT DISTINCT ?item ?itemLabel ?author ?name ?creation ?picture
WHERE
{
?item wdt:P136 wd:Q193606 . # book
?item wdt:P50 ?author . # author
?item wdt:P577 ?creation .
?item wdt:P577 ?end .
?author rdfs:label ?name .
OPTIONAL{ ?item wdt:P18 ?picture }
FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) .
FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) .
SERVICE wikibase:label
{
bd:serviceParam wikibase:language "en" .
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,该查询在列表中放置了重复项。DISTINCT 没有多大作用。一段时间后,我发现原因是“?item rdfs:label ?name .”。如果删除此行,则不会列出重复项。但我需要这一行来在列表中显示作者姓名!有想法该怎么解决这个吗?
wikidata ×10
sparql ×5
wikidata-api ×2
bigdata ×1
c++ ×1
database ×1
date ×1
doctrine-orm ×1
json ×1
php ×1
python-2.7 ×1
rapidjson ×1
rdf ×1
wikipedia ×1