2017-03-01 5 views
0

Ich habe einen IRI, die einen Schrägstrich im IRI hat:Slash in IRI (SPARQL)

Beispiel triple

:name/name1 :hasCity :City. 

ich alle Namen suchen, die den Schrägstrich in ihnen haben.

Ich habe die Abfrage versucht:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"/")} 

Das gibt mir alle Namen, auch wenn sie ein/

Die haben nicht versucht, I:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"//")} 

dies gibt auch Ich alle Namen einschließlich diejenigen, die keine/

haben Ich habe versucht:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"\/")} 

dafür bekomme ich den Fehler: Bad Escape-Sequenz in einer kurzen Strings in doppelten Anführungszeichen an ‚" \‘

ein richtiger Weg, die, die mit Gibt es zu bekommen‚/‘nur in dem Teil nach das IRI-Präfix?

Nachfolgefrage: Gibt es eine Möglichkeit, diese Namen abzufragen, ohne dass ein Fehler von SPARQL ausgegeben wird?

+0

Short IRIs, die mit „:“ get erweitert, um volle IRIs durch Anhängen des Standard-Namespace vor ihnen. In den meisten Fällen enthält der Namespace bereits "/" - Zeichen (http: // oder file: /) und daher entspricht Ihre Regex einem solchen IRI. – CaptSolo

+1

BTW "/" ist ein Schrägstrich (oder nur Schrägstrich) und kein umgekehrter Schrägstrich. – CaptSolo

+1

@DRSK: Meinst du Schrägstrich '/' oder Backslash '\'? Wenn Sie wirklich Slash '/' meinen, funktioniert dies nicht für URIs, da diese nach der Protokolldefinition normalerweise bereits Schrägstriche enthalten. Ansonsten bearbeiten Sie bitte Ihre Frage. – AKSW

Antwort

1

Die meisten "typischen" IRIs haben bereits mindestens zwei Schrägstriche in ihnen (zB in http: //), aber nicht alle IRIs sind so (zB urn: ex: foo), so Es wird keinen universellen Weg geben, dies zu tun. Wenn Sie jedoch hauptsächlich "typische" IRIs verwenden, können Sie einfach einen regulären Ausdruck verwenden, der nach den doppelten Schrägstrichen nach einem Schrägstrich sucht, z. B. "//.*/". Zum Beispiel:

select ?name { 
    values ?name { <urn:ex:foo>    #-- no slash, but won't match 
       <http://example.org>  #-- no slash 
       <http://example.org/foo> #-- a slash 
       } 
    filter regex(str(?name), "//.*/") 
} 
---------------------------- 
| name      | 
============================ 
| <http://example.org/foo> | 
---------------------------- 
2

Example triple

:name/name1 :hasCity :City. 

I've tried the query:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"/")} 

This gives me all names even if they don't have a /

Diese Antwort ist fast sicher richtig, aber es ist nicht offensichtlich, weil Sie abgekürzte Namen suchen.

Versuchen Sie Folgendes:

select (str(?name) as ?fullname) {?name ?pred ?obj FILTER regex(str(?name),"/")} 

, die sicherstellen, dass der Name des Objekts angezeigt wird, wie durch die regex gesehen. Meine Vermutung ist, dass alle Ihre Objekte URIs haben, beginnend mit http:// oder ähnlich, und sie werden offensichtlich übereinstimmen.

+0

Die Abfrage, die Sie mir geben, gibt mir immer noch alle Namen (wie Sie bemerkt haben), da es ein // in der http gibt. Wie kann ich Namen (d. H. Nach der URL) erhalten, die einen Schrägstrich haben? – DRSK

+0

Es gibt keine richtige Antwort, weil es keine allgemeine Funktion gibt, die einen URI akzeptiert und einen kurzen Namen zurückgibt. Eine einfache Übereinstimmung ist '[^ /]/[^ /]' (d. H. Einzelner Schrägstrich, der von Nicht-Schrägstrichen benachbart ist). – user205512