如何正确使用SPARQL OPTIONAL来检索可能存在的资源属性?

16

我正在尝试使用 SPARQL 查询检索有关 DBpedia 资源(人员)的信息。我想使用相同的查询通过参数化资源 URI 检索有关任何人员的数据。由于某些属性可能不存在于特定资源中,因此我正在利用 OPTIONAL 语句。以下是我的查询:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    PREFIX dbpprop: <http://dbpedia.org/property/>
    PREFIX foaf: <http://xmlns.com/foaf/0.1/>
    SELECT DISTINCT ?label ?abstract ?placeOfBirth 
        ?birthPlace ?birthDate ?deathDate ?page ?thumbnail 
    WHERE { 
        <http://dbpedia.org/resource/Neil_Simon> rdfs:label ?label ;
            dbo:abstract ?abstract ;
            foaf:page ?page .
        OPTIONAL {
            <http://dbpedia.org/resource/Neil_Simon> dbpprop:placeOfBirth ?placeOfBirth ;
                dbpprop:birthPlace ?birthPlace ;
                dbo:birthDate ?birthDate ;
                dbo:deathdate ?deathDate ;
                dbo:thumbnail ?thumbnail .
        }
        FILTER (LANG(?label) = 'en')    
        FILTER (LANG(?abstract) = 'en')
    }
    LIMIT 1

我除了OPTIONAL中的标签、摘要和页面,其它全部去掉了,因为如果我用同样的查询去查找另一个人时,他们可能没有这些属性。问题是,这些可选属性都没有显示在结果中。在尼尔·西蒙(Neil Simon)的案例中,你可以看到有birthDatebirthPlacethumbnail的值:http://dbpedia.org/resource/Neil_Simon。然而,当我运行查询时,这些值并没有出现:DBpedia SPARQL query。我做错了什么,如何可选地检索这些属性?

1个回答

16
尽管您使用了一个“OPTIONAL”结构,但映射模式本身需要其中的所有属性匹配。因此,只有当您具有“birthPlace”,“birthDate”,“deathDate”和“thumbnail”时,内部可选结构才得到满足。
我建议将“OPTIONAL”结构拆分为多个“OPTIONAL”结构。

当然,这很有道理!我把“可选”结构拆成了每个属性一个单独的结构,现在完美运行。 - Ganesh Kumaraswamy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接