有没有可能将这两个SPARQL更新查询合并为一个?

3
我希望执行更新操作以删除RDF存储中两个节点之间的链接(谓词)。该链接是双向的(skos:narrower和skos:broader)。我想进行一个独特的查询,确保在一次操作中删除两个链接。
目前,我正在使用这两个查询(在执行时,?term和?parentTerm将绑定具体的URIs):
  PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
  PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>      
  DELETE
  WHERE{ 
    GRAPH ?graph {
      ?term skos:broader ?parentTerm
    }
  }

  PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
  PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>      
  DELETE
  WHERE{ 
    GRAPH ?graph {
      ?parentTerm skos:narrower ?term
    }
  }

有没有一种方法可以创建唯一的查询,而不会改变可能存在于谓词之间的其他链接(即:谓词)?
我尝试使用分号将查询分开,并将其作为单个命令发送到Sesame存储(就像在SQL中有时所做的那样),但它没有起作用。
2个回答

7
抱歉无法在前面回答中写评论...
你可以编写以下内容:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>      
DELETE {
  GRAPH ?graph {
    ?term skos:broader ?parentTerm .
    ?parentTerm skos:narrower ?term .
  }
}    
WHERE { 
  GRAPH ?graph {
    OPTIONAL { ?term skos:broader ?parentTerm }
    OPTIONAL { ?parentTerm skos:narrower ?term }
  }
}

由于无法在DELETE WHERE中使用OPTIONAL,因此它更加冗长,但效率不应显著降低。

请注意,您还可以使用“;”分隔SPARQL更新操作,并将它们发送到单个请求中,这应该会让您获得相同的行为。


谢谢回答!我也会接受它的,但只有一个是被授权的.. 作为新手不能赞同这个答案... - blackbox

4

您可以将两个三元组模式合并为一个查询:

PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>      
DELETE
WHERE{ 
  GRAPH ?graph {
    ?term skos:broader ?parentTerm .
    ?parentTerm skos:narrower ?term .
  }
}

请注意,这将仅删除两者都存在的内容,但根据您的数据情况看来是符合条件的。

谢谢提议。如果只有一个存在,是否有删除的方法? - blackbox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接