1

当我运行这个 SPARQL 更新时:

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

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

4

2 回答 2

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.

至于你问的具体问题,

是不是因为?s从 INSERT 子句不能同时?s绑定?o

同时绑定没有问题。查询的 WHERE 部分产生一组(可能是空的)结果,每个结果都绑定?s?o?x。然后,对于每个解决方案,使用?s和的值?o来构造value-of-s foaf:firstName value-of-o三元组,并将所有这些三元组插入n4. n4由于结果集为空(出于上述原因),因此没有插入任何内容。

于 2013-09-04T13:03:43.877 回答
1

我使用了 0.2.7 版的 Jena Fuseki。我认为问题在于我必须明确创建图形,然后运行 ​​INSERT 更新。这适用于一个图,但如果您想将 groupgraphpattern 评估为更大的数据集(例如 n1、n2、n3),它不会给您任何结果。

于 2013-09-06T11:26:37.503 回答