SPARQL插入查询不插入

时间:2013-09-04 12:56:01

标签: rdf sparql

运行此SPARQL更新时:

INSERT {
  GRAPH <n4> {
    ?s foaf:firstName ?o
  }
}
WHERE {
  GRAPH <n1> {
    ?s foaf:familyName ?o .
    ?o foaf:familyName ?x
  }
}

虽然它在语法上很好,但我没有得到任何结果。是因为INSERT子句中的?s不能同时绑定到?s?o吗?

2 个答案:

答案 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),它将不会给您带来任何结果。