我之前使用三重模式的Uri绑定变量作为GRAPH参数,但是当我使用下面显示的BIND / URI / CONCAT的结果时,它的行为不符合预期:它不匹配任何已知的图形。我检查过?graph变量正在解析为预期的Graph Uri。如果模式应该有效,那么我会忽略一个可变的范围问题吗?
SELECT ?s ?p ?o WHERE { GRAPH <http://www.interition.net/g1> { <s1> :aProperty ?literal . BIND ( URI(CONCAT("http://www.interition.net/graphs/", ?literal )) AS ?graph) . } GRAPH ?graph { ?s ?p ?o . } }
示例nQuads
<s1> <http://www.interition.net/ref/aProperty> "g2" <http://www.interition.net/g1> .
<s2> <http://www.interition.net/ref/aState> "happy" <http://www.interition.net/graphs/g2> .
答案 0 :(得分:1)
看起来问题源于我们正在使用的三元组。我编造了两个虚拟ttl文件,我将其上传到Jena的Fuseki中的两个图表中,查询就像Andy演示的一样。
但是,我们目前正在使用较旧版本的BigData作为我们在Interition的商店,它似乎不支持这种类型的变量传递给图表......我会在最新版本上尝试发布,我们将重新考虑是否升级或切换到Fuseki。如果问题在最新版本中仍然存在,我将与开发团队一起提出。
答案 1 :(得分:0)
看起来数据中的<s1>
与查询中的<s1>
不匹配。
尝试使用&#34; arq.qparse&#34;打印查询。 (或者只是在程序中打印&#34; toString&#34;)。 <s1>
的相对URI已解决。
如何创建N-Quads? API不检查URI。
尝试:
PREFIX ref: <http://www.interition.net/ref/>
SELECT ?graph ?s ?p ?o
WHERE
{ GRAPH <http://www.interition.net/g1>
{ ?s1 ref:aProperty ?literal
BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph)
}
GRAPH ?graph
{ ?s ?p ?o }
}
我明白了:
-----------------------------------------------------------------------
| graph | s | p | o |
=======================================================================
| <http://www.interition.net/graphs/g2> | <s2> | ref:aState | "happy" |
-----------------------------------------------------------------------
答案 2 :(得分:0)
此问题可能与您在RDF存储中如何实现查询评估有关。当评估第一个GRAPH
块时,它会导致?graph
的一组绑定。通常,此绑定仅在查询评估的最后阶段应用于两个组,其中块将跨此变量连接。不需要将其用于实际匹配第二图形模式。编写查询的另一种方法是匹配过滤器中的图形:
PREFIX ref: <http://www.interition.net/ref/>
SELECT ?graph ?s ?p ?o
WHERE {
GRAPH <http://www.interition.net/g1> {
?s1 ref:aProperty ?literal
BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph1)
}
GRAPH ?graph2 {
?s ?p ?o
}
FILTER(?graph1 = ?graph2)
}