1

尝试使用 rdf4j 控制台对 sparql 端点执行查询,以使用属性通配符查找 2 个节点之间的路径,但没有运气。第一个查询给出了一个错误

格式错误的查询:不是有效的(绝对)IRI:

第二个查询使控制台崩溃。我是否应该尝试使用不同的方式使用查询来查询端点,因为这可能是 rdf4j 问题还是查询本身是错误的?

PREFIX xy: <http://mainuri/>

select
*

where

{

  <http://uriOfInstanceOfData> ((<>|!<>)|^(<>|!<>))* ?x .
  ?x ?p ?o .
  ?o ((<>|!<>)|^(<>|!<>))* <http://uriOfInstanceOfData>.
  }

PREFIX xy: <http://mainuri/>

select
*

where

{

  <http://uriOfInstanceOfData> (xy:|!xy:)* ?x .
  ?x ?p ?o .
  ?o (xy:|!xy:)* <http://uriOfInstanceOfData>.
  }
4

1 回答 1

2

第一个查询在语法上不正确:<>不是有效的 IRI 引用。SPARQL 语法允许使用空字符串,但规范还指出,任何 IRI 引用都必须是(在转义处理结果之后)在有效 RFC3987 IRI 中的字符串。由于 IRI 至少需要方案标识符,因此根据定义,空字符串可能不是有效的 IRI。

当我在一个小型测试数据集上尝试时,第二个查询有效。然而,处理起来可能非常昂贵。

编辑我实际尝试过的查询:

PREFIX xy: <http://mainuri/>
select
*
where
{
  rdfs:domain (xy:|!xy:)* ?x .
  ?x ?p ?o .
  ?o (xy:|!xy:)* rdf:Property.
}

在启用了基本 RDFS 推理的本地内存数据库上,结果如下:

Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| x                      | p                      | o                      |
+------------------------+------------------------+------------------------+
| rdfs:domain            | rdf:type               | rdf:Property           |
| rdfs:domain            | rdfs:domain            | rdf:Property           |
+------------------------+------------------------+------------------------+
2 result(s) (28 ms)
于 2019-10-14T23:28:52.160 回答