3

我想执行更新以删除我的 RDF 存储中两个节点之间的链接(谓词)。该链接是双向的(skos:narrower 和 skos:broader)。我想做一个唯一的查询,以确保在唯一的操作中删除两个链接。

目前,我正在使用这两个查询( ?term 和 ?parentTerm 都将在执行时与特定的 URI 绑定):

  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
    }
  }

有没有办法进行唯一查询,而不改变谓词之间可能存在的其他链接(又名:谓词)?

我厌倦了使用 ; 分离查询,并将其作为单个命令发送到芝麻商店(就像您有时在 SQL 中所做的那样),但它不起作用。

4

2 回答 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 }
  }
}

它更加冗长,因为您不能将 OPTIONAL 与 DELETE WHERE 一起使用,但它的效率应该不会显着降低。

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

于 2011-11-30T11:38:09.327 回答
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 .
  }
}

请注意,这只会删除两者都存在的情况,但听起来您的数据就是这种情况。

于 2011-11-30T08:29:44.670 回答