如何在SPARQL构造查询中递归扩展空白节点?

rog*_*err 11 rdf semantic-web sparql semantics blank-nodes

可能很容易回答这个问题,但我甚至无法弄清楚如何制定Google查询来查找它.

我正在针对包含空白节点的数据集编写SPARQL构造查询.所以,如果我做一个像这样的查询

CONSTRUCT {?x ?y ?z .} WHERE {?x ?y ?z .}

然后我的一个结果可能是:

nm:John nm:owns _:Node

这是一个问题,如果所有的

_:Node nm:has nm:Hats

三元组也不会以某种方式进入查询结果(因为我使用的一些解析器就像rdflib for Python真的不喜欢悬空的bnodes).

有没有办法编写我的原始CONSTRUCT查询以递归方式添加附加到任何bnode结果的所有三元组,以便在我的新图形中没有留下任何bnodes?

use*_*512 11

递归是不可能的.我能想到的最接近的是SPARQL 1.1属性路径(注意:该版本已过期)但是bnode测试不可用(afaik).

你可以删除带有尾随bnodes的语句:

CONSTRUCT {?x ?y ?z .} WHERE 
{
  ?x ?y ?z .
  FILTER (!isBlank(?z))
}
Run Code Online (Sandbox Code Playgroud)

或试试你的运气取下一点:

CONSTRUCT {?x ?y ?z . ?z ?w ?v } WHERE 
{
  ?x ?y ?z .
  OPTIONAL {
    ?z ?w ?v
    FILTER (isBlank(?z) && !isBlank(?v))
  }
}
Run Code Online (Sandbox Code Playgroud)

(最后一个查询非常严厉,顺便说一句)

你可能会更好DESCRIBE,通常会跳过bnodes.

  • 您不能说"SPARQL正在实现整个预过滤器子图...":不同的SPARQL引擎实现将具有不同的算法,具有不同的优点和缺点.它甚至会根据您使用的库的版本而有所不同. (2认同)