运行此SPARQL更新时:
INSERT {
GRAPH <n4> {
?s foaf:firstName ?o
}
}
WHERE {
GRAPH <n1> {
?s foaf:familyName ?o .
?o foaf:familyName ?x
}
}
虽然它在语法上很好,但我没有得到任何结果。是因为INSERT子句中的?s
不能同时绑定到?s
和?o
吗?
答案 0 :(得分:3)
您的查询在语法上对SPARQL很好,但在大多数情况下,它可能匹配的模式不是合法的RDF。特别是,这种模式不太可能:
?s foaf:familyName ?o .
?o foaf:familyName ?x
将永远匹配您的数据。 ?o
的值很可能是一个字符串,它是一个RDF文字,文字不能成为RDF三元组的主题,因此?o foaf:familyName ?x
不可能匹配。因为这意味着没有三元组将匹配查询的WHERE部分,所以没有任何内容可以插入。我建议你先运行
SELECT ?s ?o WHERE {
GRAPH <n1> {
?s foaf:familyName ?o .
?o foaf:familyName ?x
}
}
查看INSERT可用的?s
和?o
的值。我希望您不会看到任何结果,这就是为什么您没有在n4
中插入任何三元组。
关于你提出的具体问题,
是否因为INSERT子句中的
?s
无法同时绑定到?s
和?o
?
同步绑定没有问题。查询的WHERE部分生成一组(可能为空)结果,每个结果绑定?s
,?o
和?x
。然后,对于每个解决方案,使用?s
和?o
的值来构建三元组value-of-s foaf:firstName value-of-o
,并将所有这些三元组插入到n4
中。没有任何内容被插入n4
,因为结果集是空的(由于上述原因)。
答案 1 :(得分:1)
我使用了0.2.7版的Jena Fuseki。我认为问题是我必须明确创建图形,然后运行INSERT更新。这适用于一个图形,但是,如果要将groupgraphpattern评估为更大的数据集(例如n1,n2,n3),它将不会给您带来任何结果。