SPARQL:删除重复的属性

时间:2016-08-23 08:12:04

标签: duplicates sparql

我找不到这个问题的答案,所以我开了一个新问题。我有一个像这样的RDF数据集:

<dc:Terminal rdf:ID="_1A5C">
<dc:Terminal.ConnectivityNode rdf:resource="#_CN1"></dc:Terminal.ConnectivityNode>
<dc:Terminal.ConnectivityNode rdf:resource="#_CN2"></dc:Terminal.ConnectivityNode>
<dc:Object.description>DESC</dc:Object.description>
<dc:Object.name>T1</dc:Object.name>
<dc:Equipment rdf:resource="#_E8455C1C0A63"></dc:Equipment>
</dc:Terminal>

...我需要区分属性dc:Terminal.ConnectivityNode。例如,要将其重命名为 dc:Attribute1 (在此示例中包含CN1)和 dc:Attribute2 (包含CN2 in这个例子)。

但是当我查询dc:Terminal.ConnectivityNode时,它总会选择它们。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

让我们首先使用三元组的Turtle文本序列化。这使得理解三元组变得更加容易:

:_1A5C
  rdf:type dc:Terminal ;
  dc:Equipment <http://marklogic.icap.org/unnamed#_E8455C1C0A63> ;
  <http://example.org/file1#Object.description> "DESC" ;
  <http://example.org/file1#Object.name> "T1" ;
  <http://example.org/file1#Terminal.ConnectivityNode> <http://marklogic.icap.org/unnamed#_CN1> ;
  <http://example.org/file1#Terminal.ConnectivityNode> <http://marklogic.icap.org/unnamed#_CN2> . 

如果这些是特定要求,那么您可以使用强力查询。这是<http://marklogic.icap.org/unnamed#_CN2>值的一个:

PREFIX dc: <http://example.org/so#>
DELETE {
    :_1A5C ?p <http://marklogic.icap.org/unnamed#_CN2> .
}
INSERT {
   :_1A5C dc:Attribute2 <http://marklogic.icap.org/unnamed#_CN2> .
}
WHERE {
   :_1A5C ?p <http://marklogic.icap.org/unnamed#_CN2> .
}

或者你可以根据你给出的例子来概括:

PREFIX dc: <http://example.org/so#>
DELETE {
   :_1A5C ?p ?o
}
INSERT {
   :_1A5C ?newProp ?o
}
WHERE {
   :_1A5C ?p ?o .
   BIND(xsd:string(?o) AS ?objStr)
   # get the end char to append to the new property, e.g. '_CN1' ==> 'Attribute1'
   BIND(SUBSTR(?objStr, (STRLEN(?objStr))) AS ?endChar)
   BIND(IRI(CONCAT("http://example.org/so#Attribute", ?endChar)) AS ?newProp)
   FILTER CONTAINS(xsd:string(?o), "_CN")
}