【问题标题】:Can't get actor names for a given film title when multiple films have the same name in DBpedia当多部电影在 DBpedia 中具有相同名称时,无法获取给定电影标题的演员姓名
【发布时间】:2021-04-28 17:42:52
【问题描述】:

我正在尝试使用我的 sparql 查询获取给定电影标题的演员姓名(我也有发布日期),但考虑到多部电影具有相同名称的情况,我试图将它们区分为发布日期。有些电影没有指定上映日期,有些电影没有指定标签。

我试图在指定发行日期并且匹配时获得结果,或者当它在电影的标签中并且也匹配时。 如果我无法将日期与这些属性之一匹配,我不希望返回任何结果

这是我当前的查询:

PREFIX  dbo:  <http://dbpedia.org/ontology/>
PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
    
SELECT DISTINCT ?film  ?aname
WHERE {
    ?film  a             dbo:Film ;
           foaf:name     "A Nightmare on Elm Street"@en ;
           dbo:starring  ?a .
    ?a     foaf:name     ?aname
    OPTIONAL
      { ?film  dbo:releaseDate  ?rd
        BIND(year(xsd:date(?rd)) AS ?rrd)
        FILTER ( ( ?rd = "1984-04-30"^^xsd:date ) || ( ?rrd = 1984) )
      }
    OPTIONAL
      { ?film  rdfs:label  ?lab
        FILTER regex(?lab, "1984", "i")
        FILTER ( lang(?lab) = "en" )
      }
  }

【问题讨论】:

    标签: sparql


    【解决方案1】:

    我认为你在这里误用了OPTIONAL。相反,您应该查看UNION。 有什么区别?

    SELECT ?person ?child
    WHERE {
    ?person a :Person .
    OPTIONAL {?person :hasSon ?child}
    OPTIONAL {?person :hasDaughter ?child}
    }
    

    将返回每个人,并可选择返回他们的儿子/女儿。但是,这也会返回根本没有孩子的人。

    取而代之的是:

    SELECT ?person ?child
    WHERE {
    ?person a :Person .
    {?person :hasSon ?child}
    UNION
    {?person :hasDaughter ?child}
        }
    

    只会退回至少有一个儿子或女儿的人。

    现在,在您的示例中,我有一个这样的查询:

    PREFIX  dbo:  <http://dbpedia.org/ontology/>
    PREFIX  dbp:  <http://dbpedia.org/property/>
    PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
    PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
        
    SELECT DISTINCT ?film  ?aname
    WHERE {
        ?film  a             dbo:Film ;
               foaf:name     "A Nightmare on Elm Street"@en ;
               dbo:starring  ?a .
        ?a     foaf:name     ?aname
       
          { ?film  dbp:released  1984}
        UNION
          { ?film  rdfs:label  ?lab
            FILTER regex(?lab, "1984", "i")
            FILTER ( lang(?lab) = "en" )
          }
      }
    

    请注意,我使用的 dbp:released 属性似乎可以正常工作。

    似乎用于发布的属性在不同电影中不一致,即一些使用 dbp:released ,另一些使用 dbo:releaseDate

    如果这是个问题,您当然可以在查询中添加另一个 UNION 语句来处理不同的情况。

    还有一点: 那里有许多具有推理功能的三元组,而推理可以帮助处理各种此类情况(消歧、同一事物的多个属性等)

    【讨论】:

    • 非常感谢,您为我的项目救了我!
    • 我很高兴这有帮助。
    猜你喜欢
    • 2015-06-25
    • 2020-10-29
    • 2017-04-18
    • 2019-04-16
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多