1

我想运行以下简单的测试查询:

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT  ?givenName ?name_count ?temp
WHERE
  { BIND(if(( ?name_count = 2 ), "just two", "definitely not 2") AS ?temp)
    { SELECT DISTINCT  ?givenName (COUNT(?givenName) AS ?name_count)
      WHERE
        { ?y  vcard:Family  ?givenName }
      GROUP BY ?givenName
    }
  }

我正在查询的图表来自教程https://jena.apache.org/tutorials/sparql_data.html

@prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://somewhere/MattJones/>  vCard:FN   "Matt Jones" .
<http://somewhere/MattJones/>  vCard:N    _:b0 .
_:b0  vCard:Family "Jones" .
_:b0  vCard:Given  "Matthew" .


<http://somewhere/RebeccaSmith/> vCard:FN    "Becky Smith" .
<http://somewhere/RebeccaSmith/> vCard:N     _:b1 .
_:b1 vCard:Family "Smith" .
_:b1 vCard:Given  "Rebecca" .

<http://somewhere/JohnSmith/>    vCard:FN    "John Smith" .
<http://somewhere/JohnSmith/>    vCard:N     _:b2 .
_:b2 vCard:Family "Smith" .
_:b2 vCard:Given  "John"  .

<http://somewhere/SarahJones/>   vCard:FN    "Sarah Jones" .
<http://somewhere/SarahJones/>   vCard:N     _:b3 .
_:b3 vCard:Family  "Jones" .
_:b3 vCard:Given   "Sarah" .

现在的问题是用 Jena 运行它:

Query query = QueryFactory.create(theAboveQueryAsString);
QueryExecution qexec = QueryExecutionFactory.create(query, theAboveGraphmodel);
ResultSet execSel = qexec.execSelect();
ResultSetRewindable results = ResultSetFactory.copyResults(execSel);;
ResultSetFormatter.out(System.out, results, query);

在控制台中给出这个结果:

----------------------------------
| givenName | name_count | temp  |
==================================
| "Smith"   | 2          |       |
| "Jones"   | 2          |       |
----------------------------------

将临时值设为空。

另一方面,在 Ontotext GraphDb 环境中的同一图表上运行相同的查询,我得到正确的结果(另存为 CSV):

givenName  |  name_count  |  temp
------------------------------------
Jones      |       2      |  just two
Smith      |       2      |  just two

ARQ 引擎中可能有错误还是我遗漏了什么?提前致谢。

我正在使用 jena-arq 3.12.0 Java(TM) SE 运行时环境(构建 1.8.0_181-b13)Eclipse 版本版本:2019-06 (4.12.0)

4

1 回答 1

1

BIND 和子选择之间存在连接。连接步骤的参数是在连接完成之前计算的。所以 BIND 被评估,子选择被单独评估,结果被连接起来。?name_count 未在 BIND 分配中设置。如果在子选择之后移动它,它将应用于子选择的结果。

BIND 将绑定添加到它之前的模式的结果。

(base <http://example/base/>
  (prefix ((rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
           (vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>))
    (project (?givenName ?name_count ?temp)
      (join
        (extend ((?temp (if (= ?name_count 2) "just two" "definitely not 2")))
          (table unit))
        (distinct
          (project (?givenName ?name_count)
           (extend ((?name_count ?.0))
             (group (?givenName) ((?.0 (count ?givenName)))
               (bgp (triple ?y vcard:Family ?givenName))))))))))

在这里,(extend...)是 的两个参数之一(join...)(table unit)是 BIND 之前的“无”。

如果放在后面,代数是:

(base <http://example/base/>
  (prefix ((rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
           (vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>))
    (project (?givenName ?name_count ?temp)
      (extend ((?temp (if (= ?name_count 2) "just two" "definitely not 2")))
        (distinct
          (project (?givenName ?name_count)
            (extend ((?name_count ?.0))
              (group (?givenName) ((?.0 (count ?givenName)))
                (bgp (triple ?y vcard:Family ?givenName))))))))))

并且extend(来自语法 BIND)正在处理(distinct ...子查询。

于 2019-08-01T21:44:06.973 回答