首页 文章

为什么这个SPARQL查询不能用于Prolog?

提问于
浏览
1

我正在尝试将SPARQL查询集成到Prolog程序中(我正在使用SWI-Prolog)

为了测试它我正在做以下操作:

  • 进入SWI-Prolog shell我执行以下命令: use_module(library(semweb/sparql_client)). 加载sparql客户端库

  • 然后,在SWI-Prolog shell中,我执行以下SPARQL查询:

? - sparql_query('select count(*)where {?person a http://dbpedia.org/ontology/Person . ?person http://it.dbpedia.org/property/nome?name.filter regex(?name,"Leonardo") . } ', Row, [ host(' dbpedia.org '), path(' / sparql / ')]). Row = row(literal(type(' http://www.w3.org/2001/XMLSchema#integer ', ' 0'))) .

我不太清楚SPARQL,但我认为这很简单,并且以这种方式工作:

此查询询问实例在RDF本体上称为dbpedia的个人名称的对象数,并传递输入参数“Leonardo” .

你可以看到问题似乎找不到这种类型的任何实例(我也尝试过其他人的名字)

为什么?我错过了什么?

1 回答

  • 5

    您的查询不会返回您希望它返回的内容 . 您可以与DBpedia SPARQL endpoint交互使用SPARQL . 我建议您使用它来调试查询并确保它首先返回您想要的内容,然后将其复制到Prolog程序中 . 您可以将其逐块构建,以确保它能够提供合适的结果 . 例如,从以下内容开始:

    select * where {
      ?person a <http://dbpedia.org/ontology/Person> .
    }
    LIMIT 10
    

    SPARQL results

    然后逐个展开:

    select * where {
      ?person a <http://dbpedia.org/ontology/Person> .
      ?person <http://it.dbpedia.org/property/nome> ?name .
    }
    LIMIT 10
    

    SPARQL results

    此查询不返回任何内容,因此最好在继续执行FILTER或COUNT之前对其进行调试 .

    在使用 endpoints 播放一段时间之后,似乎使用REGEX会像其他字符串操作一样昂贵 . 如果你可以直接查询你想要的字符串,你可能会更好 . 不幸的是,您还需要开始使用语言标签 . 例如,这里有一个查询,用于计算具有给定名称或姓氏 "Leonardo" 的人 .

    select COUNT(?person) where {
      ?person a dbpedia-owl:Person .
      { ?person foaf:givenName "Leonardo" }
      UNION 
      { ?person foaf:surname "Leonardo" }
    }
    

    SPARQL results

    它返回 0 . 但是,如果我们为这些字符串添加(英语)语言标记,我们会得到不同的结果( 133 ):

    select COUNT(?person) where {
      ?person a dbpedia-owl:Person .
      { ?person foaf:givenName "Leonardo"@en }
      UNION 
      { ?person foaf:surname "Leonardo"@en }
    }
    

    SPARQL results

相关问题