如何使用 SPARQL 查询获取 IRI 之间或某些 rdf:type 的两个节点之间的路径?

How to get a path between IRIs or between two nodes of certain rdf:type using a SPARQL query?

尝试使用 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>.
  }

第一个查询在语法上不正确:<> 不是有效的 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)