嗨所有rdf/sparql开发人员.这个问题一直困扰着我一段时间,但似乎没有人能够准确地回答它,因为rdf和sparql规范已经发布.
为了说明这种情况,RDF定义了几种处理资源多值属性的方法; 从使用相同的subjet-predicate uris创建尽可能多的三元组到集合或容器.这一切都很好,因为每个模式都有自己的特点.
但是从SPARQL的观点来看,在我看来,查询这些结构导致过于复杂的查询(更糟糕的是)无法转录为合理的结果集:您不能使用变量来查询任意长度,而propertyPath也是如此不保留"自然"秩序.
在一种天真的方式中,在许多SELECT或ASK查询中,如果我想查询或过滤容器或列表的值,我绝大多数时候都不会关心底层模式究竟是什么(如果有的话).例如:
<rdf:Description rdf:about="urn:1">
<rdfs:label>
<rdf:Alt>
<rdf:li xml:lang="fr">Exemple n°1</rdf:li>
<rdf:li xml:lang="en">Example #1</rdf:li>
</rdf:Alt>
</rdfs:label>
<my:release>
<rdf:Seq>
<rdf:li>10.0</rdf:li>
<rdf:li>2.4</rdf:li>
<rdf:li>1.1.2</rdf:li>
<rdf:li>0.9</rdf:li>
</rdf:Seq>
</my:release>
</rdf:Description>
<rdf:Description rdf:about="urn:2">
<rdfs:label xml:lang="en">Example #2</rdfs:label>
</rdf:Description>
Run Code Online (Sandbox Code Playgroud)
显然我希望两种资源都能回答这个问题:
SELECT ?res WHERE { ?res rdfs:label ?label . FILTER ( contains(?label, 'Example'@en) }
Run Code Online (Sandbox Code Playgroud)
我也希望查询:
SELECT ?ver WHERE { <urn:1> my:release ?ver }
Run Code Online (Sandbox Code Playgroud)
按原始顺序返回rdf:Seq元素(或任何rdf:Alt)(对于其他模式,如果保留原始顺序无关紧要,为什么不保留它呢?) - 除非明确指定通过ORDER BY子句.
当然,有必要保持与旧方法的兼容性,所以也许有可能使用new运算符扩展propertyPath语法?
我觉得它会简化日常的SPARQL用例.
这对你有意义吗?此外,你有没有理由不尝试实施这个?
编辑更正了示例的urn:2 rdfs:标签值不正确
我一直在测试Sesame 2.7.2,当遇到DESCRIBE查询不包含空白节点关闭的事实时,我有一个很大的惊喜[ 编辑:正确的术语是CBD,用于简洁有界的描述 ]
如果我正确理解,SPARQL规范相当松散,并且说返回的内容实际上取决于提供者,但我仍然对选择感到惊讶,因为无法使用bnodes(在describe查询的结果中)在后续的SPARQL查询中.
所以问题是:如何在<uri1>不执行以下操作的情况下获得资源的封闭描述:
DESCRIBE <uri1>DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }如果我没有弄错的话,必须用深度2个bnodes来描述
DESCRIBE ?b2 WHERE {<uri1> <p1&> ?b . ?b <p2> ?b2 }
Run Code Online (Sandbox Code Playgroud)
除非有更简单的方法吗?
最后,让DESCRIBE一个资源的封闭描述让你仍然可以获得当前返回的结果并不是更好,更简单吗?
CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我想从芝麻回来的封闭结果的一个例子
<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
Run Code Online (Sandbox Code Playgroud)
目前:DESCRIBE <urn:sites#1>返回与查询相同的结果CONSTRUCT WHERE …