在SPARQL中查找实体的超类

时间:2017-05-03 13:16:43

标签: nlp sparql hierarchical-data superclass wikidata

我想使用维基百科数据创建一个名称实体识别器,我需要获得一个单词的所有超类,以查看该单词的类别(地点,人类,组织或无)。我上网了很多,并找到了一些页面:

当我执行查询结果“找不到匹配的记录”时,即使使用页面中提到的单词并尝试其他名称空间。 和

这与我的工作非常相似,但我也得到了“找不到匹配的记录”的结果。

我认为这些链接中提到的查询在逻辑上是正确的,但我不知道为什么它们对我没有任何结果。我还尝试通过这些网站中提到的示例学习SPARQL:

我没有找到任何可以找到一个单词的超类。

有一些我没有得到结果的代码示例:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns:<http://dbpedia.org/>

SELECT ?subClass ?label WHERE { 
    ?subClass rdfs:subClassOf ns:Albert . 
    ?subClass rdfs:label ?label . }

或:

SELECT * WHERE {
  dbpedia:Albert a ?c1 ; a ?c2 .
  ?c1 rdfs:subClassOf ?c2 .
}

如果你回答我的问题,我真的很感激。

先谢谢

3 个答案:

答案 0 :(得分:1)

  1. 谁是&#34; Albert&#34;?!您只能查询DBpedia中存在的数据。没有资源http://dbpedia.org/resource/Albert

  2. 您的第一个查询使用了错误的命名空间,至少我从未见过http://dbedia.org作为命名空间,因为资源通常是http://dbpedia.org/resource/

  3. 您的第一个查询使用public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.profil) { } else if (id == R.id.accueil) { AccueilFragment fragment = new AccueilFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment1, fragment ); fragmentTransaction.commit(); floatingActionButton.show(); getSupportActionBar().setTitle("Accueil"); } else if (id == R.id.categories) { CategoriesFragment fragment = new CategoriesFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment1, fragment ); fragmentTransaction.commit(); floatingActionButton.hide(); getSupportActionBar().setTitle("Categories"); } } 谓词错误的情况&#34; Albert&#34;应该是一种资源。表达资源&#34;:x&#34;属于类rdfs:subClassOf由RDF三:C完成。类:x a :C .有一个超类:C在RDF中用:D表示。

  4. 您的第二个查询再次使用一些旧的名称空间前缀:C rdfs:subClassOf :D .,现在称为dbpedia:并且确实代表名称空间http://dbpedia.org/resource/。但正如我在第一点提到的那样,没有任何资源可以用于&#34; Albert&#34;

  5. 单词&#34;&#34;&#34;&#34;是什么?只是为了澄清,资源属于一个类,一个类可以有超类。

  6. 如果您希望所有类包括资源所属的超类,您可以使用例如为汤姆汉克斯&#34;

    dbr:

答案 1 :(得分:1)

可能您正在寻找类似此查询的内容:

SELECT DISTINCT ?c WHERE {
  ?Q wdt:P31/wdt:P279? ?c .
  ?Q rdfs:label "Tom Hanks"@en
} 

维基数据使用自己的谓词而不是rdf:typerdfs:subClassOf(分别为wdt:P31wdt:P279)。

答案 2 :(得分:0)

因此,subClassOf谓词仅适用于通常不是实例的事​​物类。您需要通过rdf:type连接课程。

SELECT * WHERE {
  <http://dbpedia.org/resource/Albert_Einstein> a ?c1 ; a ?c2 .
  ?c1 rdfs:subClassOf ?c2 .
}

我不确定您可以从Albert获得什么类型的实体,它可能需要消除歧义。我的示例查询使用Albert Einstein作为DBPEDIA资源。

请记住,根据您感兴趣的抽象级别,您可以在根类中进行多次跳转。第二个查询上升了两个级别。

SELECT DISTINCT ?c3 WHERE {
  <http://dbpedia.org/resource/Albert_Einstein> a ?c1 ; a ?c2 .
  ?c1 rdfs:subClassOf ?c2 .
  ?c2 rdfs:subClassOf ?c3 .
}