2016-08-23 7 views
1

Ich konnte die Antwort für diese Frage nicht finden, also öffne ich eine neue. Ich habe eine RDF-Datensatz wie folgt aus:SPARQL: duplizierte Attribute entfernen

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

... und ich brauche dc:Terminal.ConnectivityNode zwischen den Attributen zu unterscheiden. Um es zum Beispiel in dc:Attribute1 (enthält CN1 in diesem Beispiel) und dc:Attribute2 (mit CN2 in diesem Beispiel) umzubenennen.

Aber natürlich, wenn ich für dc:Terminal.ConnectivityNode abfrage, wird es immer beide auswählen.

Vielen Dank für Ihre Zeit.

+0

Mögliche Duplikat [wie entfernen Duplikate in SPARQL Query] (http: // Stackoverflow. com/questions/36348328/how-to-remove-Duplikate-in-Sparql-Abfrage) – JcDenton86

+0

@ JcDenton86 Ich habe das auch gelesen, aber ich habe rdf: Ressource und habe nichts Brauchbares dort gefunden. –

+0

Warum funktioniert es nicht, LIMIT 1 zu verwenden? – AKSW

Antwort

2

Beginnen wir mit einer Turtle-Text-Serialisierung Ihrer Tripel. Dies macht es viel einfacher, die Tripel zu verstehen:

:_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> . 

Wenn diese spezifischen Anforderungen sind, dann könnten Sie eine Brute-Force-Abfrage verwenden. Hier ist eine für den <http://marklogic.icap.org/unnamed#_CN2> Wert:

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

Oder Sie könnten dies verallgemeinern pro Beispiele Sie haben:

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") 
} 
+0

Vielen Dank für Ihre Antwort. Aber der Attributwert endet nicht immer mit _CN1 oder _CN2 es war nur ein Beispiel. Es ist eine Mischung aus einigen Buchstaben und Zahlen, und nur der Attributname und die Attributwertlänge sind üblich. –

+0

OK, solange wir dem Namen etwas Regelmäßigkeit geben, sollten 'SUBSTR' und andere SPARQL-String-Funktionen die Arbeit erledigen können. – scotthenninger

+0

Hallo Schotte, kannst du weiter erklären? Es ist kein Problem, SUBSTR zu verwenden, aber ich kann nicht nur eines der beiden Attribute auswählen, da bei der Abfrage von ** für dc: Terminal.ConnectivityNode immer beide ausgewählt werden. –