我一直在测试Sesame 2.7.2,当面对DESCRIBE查询不包含空白节点关闭的事实时,我感到非常惊讶[编辑:正确的术语是{{3}的CBD }
如果我正确理解,SPARQL规范相当松散,并且说返回的内容实际上取决于提供者,但我仍然对选择感到惊讶,因为bnodes(在describe查询的结果中)不能在后续的SPARQL查询中使用。
所以问题是:如何在不执行的情况下获得资源<uri1>
的封闭描述:
DESCRIBE <uri1>
DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }
如果我没弄错的话,必须用
来描述深度为2的bnodesDESCRIBE ?b2 WHERE {<uri1> <p1&> ?b . ?b <p2> ?b2 }
除非有更简单的方法吗?
最后,让DESCRIBE
返回一个资源的封闭描述会不会更好更简单,你仍然可以通过以下内容获得当前返回的结果?
CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}
编辑:以下是我想从芝麻回来的结果示例
<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
_:autos1 a rdf:Alt .
_:autos1 rdf:_1 _:autos2
_:autos2 my:url "192.168.2.111:15001"@fr
_:autos2 my:url "192.168.2.111:15002"@en
目前:DESCRIBE <urn:sites#1>
返回与查询CONSTRUCT WHERE {<urn:sites#1> ?p ?o}
相同的结果,因此我只得到
<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
答案 0 :(得分:4)
根据您的评论,这还不是一个确切的解决方案,但请注意,您可以在给定的describe
查询中描述多个内容。例如,给定数据:
@prefix : <http://example.org/> .
:Alice :named "Alice" ;
:likes :Bill, [ :named "Carl" ;
:likes [ :named "Daphne" ]].
:Bill :likes :Elaine ;
:named "Bill" .
您可以运行查询:
PREFIX : <http://example.org/>
describe :Alice ?object where {
:Alice :likes* ?object .
FILTER( isBlank( ?object ) )
}
并获得结果:
@prefix : <http://example.org/> .
:Alice
:likes :Bill ;
:likes [ :likes [ :named "Daphne"
] ;
:named "Carl"
] ;
:named "Alice" .
这当然不是一个完整的描述,因为它只跟随:likes
:Alice
,而不是任意谓词。但它 获取名为"Carl"
和"Daphne"
的空白节点,这是一个开始。
看起来你将不得不做上面描述的事情,可能还有多次搜索,或者你将不得不修改芝麻。编写一些有创意的SPARQL的替代方法是改变Sesame实现描述查询的方式。一些端点使这相对容易,但芝麻似乎不是其中之一。 2011年有一个邮件列表主题Custom SPARQL DESCRIBE Implementation,似乎解决了同样的问题。
RobertoGarcía问道:
我正在尝试自定义SPARQL DESCRIBE查询的行为。 我愿意得到类似CBD的东西(即所有的属性和 所描述资源的值加上所有属性和值 连接到它的空白节点)。
我尝试使用CONSTRUCT查询重现类似的行为 但是性能不好,如果我,查询会变得非常复杂 尝试考虑指向空白节点的长链属性 从描述的资源开始。
Jeen Broekstra回复:
Sesame中DESCRIBE的实现在查询中是硬编码的 解析器。它只能通过调整解析器本身来改变,甚至可以改变 然后它会很棘手,因为查询模型没有简单的方法来表达它 要么:它需要代数的扩展。
&GT;如果这是不可能的,任何有关如何使用CONSTRUCT实现它的建议 疑问?
我不确定在单个查询中执行此操作在技术上是否可行。 CBD本质上是递归的,而SPARQL确实有一些支持 对于递归(属性链),问题是你必须做一个 中间检查属性链的每一步,看看是否 绑定值是否为空节点。这不是SPARQL的东西 支持开箱即用:属性链定义为只有长度 作为停止条件的路径。
使用复杂的组合也许是可能的 子查询,工会和期权,但我对此表示怀疑。
我认为最好的解决方法是使用标准DESCRIBE Sesame支持的格式,以及每个空白节点的值 结果做一个单独的连续查询。换句话说:你解决它 手。
唯一的另一个选择是记录支持CBD的功能请求 芝麻。我不能保证是否/何时会遵循 尽管如此。