SPARQL不返回owl:DBAs中存在的sameAs属性

时间:2016-05-02 18:41:52

标签: asp.net-web-api sparql dbpedia

我在a previous question取得了一些成功,但抓住其他DBpedia语言的结果却失败了一些(但不是全部)条目。

例如,

SELECT * WHERE {
  VALUES ?label {"Acid Rain"@en "Chocolate"@en}
  ?en rdfs:label ?label .
  optional { ?en owl:sameAs ?es . FILTER regex(str(?es), "es.dbpedia") }
  filter not exists {?en a skos:Concept}
}

返回

{ "head": { "link": [], "vars": ["label", "en", "es"] },
  "results": { "distinct": false, "ordered": true, "bindings": [
    { "label": { "type": "literal", "xml:lang": "en", "value": "Chocolate" }    , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Chocolate" } , "es": { "type": "uri", "value": "http://es.dbpedia.org/resource/Chocolate" }},
    { "label": { "type": "literal", "xml:lang": "en", "value": "Acid Rain" }    , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Acid_Rain" }} ] } }

请注意"Acid Rain"没有西班牙语结果。但是,http://dbpedia.org/page/Acid_rainowl:sameAs部分显然有西班牙语的结果,并以http://es.dbpedia开头。

为什么DBpedia SPARQL端点在DBpedia上明确列出时不会返回owl:sameAs结果?

1 个答案:

答案 0 :(得分:2)

我认为多种选择应该有效。也许是@ASKW在评论中提出的Virtuoso问题?

您应该能够在单个正则表达式语句中获得不同的语言,例如:

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.http.Part;

@ManagedBean
@ViewScoped
public class UploadBean implements Serializable {
    private static final long   serialVersionUID    = 1L;

    private String              field;
    private Part                file;

    /** Constructor */
    public UploadBean() {}

    /** Action handler */
    public String submit() {
        // the file is already uploaded at this point
        // TODO whatever you need to do with the file and other form values
        return ""; // ... or another view
    }

    // TODO getters and setters for fields
}

如果您正在寻找标签的西班牙语和其他语言版本,有一种更简单的方法可以做到这一点。如果是这样,请尝试以下方法:

FILTER regex(str(?es), "(es|pt).dbpedia") }

请注意SELECT * WHERE { VALUES ?label {"Acid Rain"@en "Chocolate"@en} ?en rdfs:label ?label . ?en rdfs:label ?allLabels . FILTER (lang(?allLabels) = "es") } 可能会很昂贵,因为它会有效地增加搜索空间。因此,除非必要,否则请避免使用。在您的情况下,不需要选项。

BTW的另一个解决方案是使用CONTAINS()进行过滤。