当我运行这个 SPARQL 更新时:
INSERT {
GRAPH <n4> {
?s foaf:firstName ?o
}
}
WHERE {
GRAPH <n1> {
?s foaf:familyName ?o .
?o foaf:familyName ?x
}
}
虽然它在语法上很好,但我没有得到任何结果。是不是因为?s
从 INSERT 子句不能同时?s
绑定?o
?
对于 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
.
至于你问的具体问题,
是不是因为
?s
从 INSERT 子句不能同时?s
绑定?o
?
同时绑定没有问题。查询的 WHERE 部分产生一组(可能是空的)结果,每个结果都绑定?s
、?o
和?x
。然后,对于每个解决方案,使用?s
和的值?o
来构造value-of-s foaf:firstName value-of-o
三元组,并将所有这些三元组插入n4
. n4
由于结果集为空(出于上述原因),因此没有插入任何内容。
我使用了 0.2.7 版的 Jena Fuseki。我认为问题在于我必须明确创建图形,然后运行 INSERT 更新。这适用于一个图,但如果您想将 groupgraphpattern 评估为更大的数据集(例如 n1、n2、n3),它不会给您任何结果。