我正在尝试使用 Prolog 和 DBpedia 进行 SPARQL 查询。我的目标是在文本中标记所有人员,因此为了检索名人,我进行了此查询,删除了音乐组(乐队)和组织等所有结果,因为我只想标记真实的人而不是抽象的
select ?person where{
{
?person a dbpedia-owl:Person; rdfs:label "Name Surname" @it.
}
UNION
{
?person a dbpedia-owl:Person; foaf:name "Name"@it; foaf:surname "Surname"@it.
}
UNION
{
?person a dbpedia-owl:Person; foaf:name "Name Surname"@it.
}
FILTER NOT EXISTS {
{ ?subject <http://airpedia.org/ontology/type_with_conf#10> dbpedia-owl:Band .
?subject rdfs:label ?artistName .
FILTER ( str(?artistName) = "Name Surname" )
}
UNION
{
?subject <http://airpedia.org/ontology/type_with_conf#10> dbpedia-owl:Organisation .
?subject rdfs:label ?artistName .
FILTER ( str(?artistName) = "Name Surname" )
}
}
}
我用这个。如果您运行此查询,请使用此版本的 Dbpedia,尽管结果对我不利。因此,例如,如果我搜索“Metallica”作为我不想获得结果的人,因为它是一个乐队还是(对我来说,但在这种情况下 Metallica 也是一个组织)一个组织,它运作良好,这是结果Metallica 查询结果,那些是“迈克尔杰克逊”迈克尔杰克逊查询结果
我的问题是,当我让不是歌手或音乐乐队的人时,例如,如果我尝试像“Jim Carrey”这样的东西,我会得到“错误交易超时 Jim Carrey。
我想我遇到了这个问题,因为这些属性对于 Jim Carrey 来说是未定义的,但是我尝试在第一个过滤器的每个子查询中放置一个 OPTIONAL 标记,但是我也遇到了同样的错误,我将代码放在了一个 pastebin 文件中,所以你可以找到所有三个查询
我知道我不应该在查询中使用静态字符串,或者有很多更好的模式,但我需要它,因为我用 prolog 编写查询,而不是在线发送到 sparql,所以我必须这样做。
致 @Joshua 我试图删除 NOT EXIST (Filter) 中的 FILTER(String) 但我不会再工作了,谢谢你帮助我
请原谅我编辑过多,但我解决了开始问题的一部分,但没有找到解决方案第一个问题:根据具有特定值的特定属性过滤结果。(作品)第二:第一个仅适用于具有特定属性(如上所示)的事物,例如(Metallica,Michael Jackson,The Beatles,...),但不适用于没有过滤器中的属性的事物。
(我不能使用两个以上的链接,因为我是新手,所以我将在评论中放置一个链接,其中包含带有 3 个查询及其结果的 pastebin 链接)