2015-06-17 110 views
2

我想查询维基与SPARQL让一切在名词一定语言(例如德国) 和输出的约定取得某种语言的所有名词维基:如何使用SPARQL

  • 名词
  • 语法性别(属)的字符串:男性,女性,中性

我使用的SPARQL-Endpoi nt:http://wiktionary.dbpedia.org/sparql我找到了一个例子,但我没有弄清楚 如何调整它以获得我想要的信息。

PREFIX terms:<http://wiktionary.dbpedia.org/terms/> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc:<http://purl.org/dc/elements/1.1/> 
SELECT ?sword ?slang ?spos ?ssense ?twordRes ?tword ?tlang 
FROM <http://wiktionary.dbpedia.org> 
WHERE { 
    ?swordRes terms:hasTranslation ?twordRes . 
    ?swordRes rdfs:label ?sword . 
    ?swordRes dc:language ?slang . 
    ?swordRes terms:hasPoS ?spos . 
    OPTIONAL { ?swordRes terms:hasMeaning ?ssense . } 
    OPTIONAL { 
      ?twordBaseRes terms:hasLangUsage ?twordRes . 
      ?twordBaseRes rdfs:label ?tword . 
    } 
    OPTIONAL { ?twordRes dc:language ?tlang . } 
} 

回答

6

首先,你要选择所有名词的名词义。正如您在示例查询的查询结果中看到的那样,此信息由terms:hasPoS关系捕获。因此,具体查询所有的名词,我们可以这样做:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/> 
SELECT ?term 
WHERE { 
    ?term terms:hasPoS terms:Noun . 
} 
LIMIT 100 

Result

你想接下来的事情只有在一定的语言的名词。这似乎是由dc:language关系覆盖的,所以我们在该关系上添加了一个附加约束。比方说,我们希望所有英文名词:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 

SELECT ?term 
WHERE { 
    ?term terms:hasPoS terms:Noun ; 
      dc:language terms:English . 
} 
LIMIT 100 

Result

所以,我们现在选择你想要什么,但我们还没有你想要的格式输出,如上面的查询刚返回术语意义的标识符,而不是实际术语的字符串值。我们可以从例如查询的输出看,该字符串值由rdfs:label财产捕获,因此我们补充说:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?term ?termLabel 
WHERE { 
    ?term terms:hasPoS terms:Noun ; 
      dc:language terms:English ; 
      rdfs:label ?termLabel . 
} 
LIMIT 100 

Result

如果你现在看看这个查询的结果,你会看到这种语言出现了一些奇怪的现象:尽管我们认为我们选择了英语,但我们也得到了带有不同语言标签的标签(例如'@ru')。要删除这些结果,我们可以进一步限制我们的查询,并说,我们只希望背标英文:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?term ?termLabel 
WHERE { 
    ?term terms:hasPoS terms:Noun ; 
      dc:language terms:English ; 
      rdfs:label ?termLabel . 
    FILTER(langMatches(lang(?termLabel), "en")) 
} 
LIMIT 100 

Result

最后,性别/属。在这里我不太确定。查看wiktionary数据中的一些示例资源(例如entry for dog),我会说这些信息实际上并不存在于数据中。

3

Jeen的答案是一个很好的开始。这是获取性别的选项。

由于没有语法性别,因此英语不能很好地作为示例语言。让我们以德国:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?term ?termLabel 
WHERE { 
    ?term terms:hasPoS terms:Noun ; 
      dc:language terms:German ; 
      rdfs:label ?termLabel . 
    FILTER(langMatches(lang(?termLabel), "de")) 
} 
LIMIT 100 

Result

(这将是很好的过滤许多确切的重复(我不知道怎么了,为什么他们在那里)。)

服用德语词语“Eierkopf”代替英文“dog”: 我们现在可以跟随术语链接到http://wiktionary.dbpedia.org/resource/Eierkopf-German-Noun,我们可以在这里看到德语版的维基词典http://de.wiktionary.org/wiki/Eierkopf的链接(我们也可以猜出该URL,而无需从wiktionary.dbpedia.org第一)。

这里属可以从文本中提取:“Substantiv,M”(M为男性)

为德语的选项有:

<em title="Genus: Maskulinum (grammatikalisches Geschlecht: männlich)">m</em> 
<em title="Genus: Femininum (grammatikal. Geschlecht: weiblich)">f</em> 
<em title="Genus: Neutrum (grammatikal. Geschlecht: sächlich)">n</em> 

如果名词已经基于不同性别地区/方言,官方性别位于上面的HTML中,并在下面显示评论。例如:

https://de.wiktionary.org/wiki/Butter

因此,除了查询SPARQL,它也需要每个字1-2网页请求,以及一些HTML内容提取。