首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SPARQL查询中获得SPARQL的问题答案?

如何从SPARQL查询中获得SPARQL的问题答案?
EN

Stack Overflow用户
提问于 2014-06-18 23:25:35
回答 1查看 542关注 0票数 2

在下面的代码上执行的SPARQLASK查询在虚拟SPARQL查询编辑器上执行时返回true。同样的结果是我希望返回到我的脚本中。我如何调整sparqllib的使用?

代码语言:javascript
复制
<?php
    require_once('./sparqllib.php');
    $db = sparql_connect('http://dbpedia.org/sparql');

    $query = "
    ASK {
        ?book a dbpedia-owl:Book .
        ?book dbpprop:author ?author .
        ?book dbpprop:name ?bookname .
        ?author dbpprop:name ?authorname .
        FILTER regex(?bookname, 'A Tale of Two Cities', 'i') .
        FILTER regex(?authorname, 'Dickens', 'i')
    }";

    $result = sparql_query($query);
    var_dump($result);

var_dump()的结果:

代码语言:javascript
复制
object(sparql_result)[3]
  public 'rows' => 
    array (size=0)
      empty
  public 'fields' => 
    array (size=0)
      empty
  public 'db' => 
    object(sparql_connection)[1]
      public 'db' => null
      public 'debug' => boolean false
      public 'errno' => null
      public 'error' => null
      public 'ns' => 
        array (size=0)
          empty
      public 'params' => null
      public 'caps' => 
        array (size=0)
          empty
      public 'caps_desc' => 
        array (size=7)
          'select' => string 'Basic SELECT' (length=12)
          'constant_as' => string 'SELECT ("foo" AS ?bar)' (length=22)
          'math_as' => string 'SELECT (2+3 AS ?bar)' (length=20)
          'count' => string 'SELECT (COUNT(?a) AS ?n) ?b ... GROUP BY ?b' (length=43)
          'max' => string 'SELECT (MAX(?a) AS ?n) ?b ... GROUP BY ?b' (length=41)
          'sample' => string 'SELECT (SAMPLE(?a) AS ?n) ?b ... GROUP BY ?b' (length=44)
          'load' => string 'LOAD <...>' (length=10)
      public 'caps_cache' => null
      public 'caps_anysubject' => null
      public 'endpoint' => string 'http://dbpedia.org/sparql' (length=25)
  public 'i' => int 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-19 01:02:59

简短的回答(变通办法)

sparqllib.php似乎不支持处理ask查询的结果,因此您可能应该只使用

代码语言:javascript
复制
select * where {
    ?book a dbpedia-owl:Book .
    ?book dbpprop:author ?author .
    ?book dbpprop:name ?bookname .
    ?author dbpprop:name ?authorname .
    FILTER regex(?bookname, 'A Tale of Two Cities', 'i') .
    FILTER regex(?authorname, 'Dickens', 'i')
}
limit 1

看看你是否得到了结果。

长答案(sparqllib不支持ask结果)

我不认为sparqllib支持select查询以外的其他查询。如果您查看一下sparqllib.php,您可以看到查询是如何执行的:

代码语言:javascript
复制
function query( $query, $timeout=null )
{   
    $prefixes = "";
    foreach( $this->ns as $k=>$v )
    {
        $prefixes .= "PREFIX $k: <$v>\n";
    }
    $output = $this->dispatchQuery( $prefixes.$query, $timeout );
    if( $this->errno ) { return; }
    $parser = new xx_xml($output, 'contents');
    if( $parser->error() ) 
    { 
        $this->errno = -1; # to not clash with CURLOPT return; }
        $this->error = $parser->error();
        return;
    }
    return new sparql_result( $this, $parser->rows, $parser->fields );
}

dispatchQuery负责发送查询并返回结果。它在application/sparql-results+xml中请求它们,这就是为什么涉及到XML解析器的原因。如果您查看一下XML解析代码,会发现以下内容:

代码语言:javascript
复制
function startXML($parser, $name, $attr)    
{
    if( $name == "sparql" ) { $this->looks_legit = true; }
    if( $name == "result" )
    {
        $this->result = array();
    }
    if( $name == "binding" )
    {
        $this->part = $attr["name"];
    }
    if( $name == "uri" || $name == "bnode" )
    {
        $this->part_type = $name;
        $this->chars = "";
    }
    if( $name == "literal" )
    {
        $this->part_type = "literal";
        if( isset( $attr["datatype"] ) )
        {
            $this->part_datatype = $attr["datatype"];
        }
        if( isset( $attr["xml:lang"] ) )
        {
            $this->part_lang = $attr["xml:lang"];
        }
        $this->chars = "";
    }
    if( $name == "variable" )
    {
        $this->fields[] = $attr["name"];
    }
}

现在,如果您看一下SPARQL查询结果XML格式(第二版),它定义了结果应该是什么样子,特别是2.3.2.布尔结果,我们就会看到询问查询的结果应该如下所示

sparqllib.php不包括任何东西来查找名为"boolean“的元素。它似乎只用于处理select结果。尽管如此,代码是在LGPL下授权的,并且根据文件头在GitHub上是可用的,所以如果您想要的话,您应该能够分叉它并添加ask支持:

代码语言:javascript
复制
###############################
# Christopher Gutteridge 2010
#  cjg@ecs.soton.ac.uk
#  LGPL License 
#  http://graphite.ecs.soton.ac.uk/sparqllib/
#  https://github.com/cgutteridge/PHP-SPARQL-Lib
###############################
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24296555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档