2017-03-01 1 views
0

J'ai un IRI qui a une barre oblique dans l'IRI:Slash dans l'IRI (SPARQL)

Exemple triple

:name/name1 :hasCity :City. 

Je veux trouver tous les noms qui ont la barre oblique en eux.

J'ai essayé la requête:

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

Cela me donne tous les noms, même si elles ne sont pas/

Le j'ai essayé:

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

cela donne aussi moi tous les noms, y compris ceux qui ne disposent pas d'un/

Le j'ai essayé:

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

pour que je reçois l'erreur: séquence d'échappement Bad dans une courte chaîne double cité à « " \ »

Y at-il une bonne façon d'obtenir ceux avec « seulement/» dans la partie après le préfixe IRI? Question de suivi: Existe-t-il un moyen d'interroger ces noms sans que sparql ne renvoie une erreur?

+0

court IRIs qui commencent par « : » s'élargie à IRIs complète en ajoutant l'espace de noms par défaut devant eux. Dans la plupart des cas, l'espace de noms contient déjà des caractères "/" (http: // ou fichier: /) et votre expression régulière correspondra donc à un tel IRI. – CaptSolo

+1

BTW "/" est une barre oblique (ou simplement une barre oblique) non antislash. – CaptSolo

+1

@DRSK: Voulez-vous dire slash '/' ou backslash '\'? Si vous voulez vraiment dire slash '/', cela ne fonctionnera pas pour les URI car ils contiennent généralement des barres obliques après la définition du protocole. Sinon, veuillez éditer votre question. – AKSW

Répondre

1

La plupart des "typiques" EIRI déjà au moins deux barres obliques en eux (par exemple, dans http: //), mais pas tous les IRIs sont comme ça (par exemple, urn: ex: foo), donc il n'y aura pas de moyen universel de le faire. Toutefois, si vous utilisez principalement des IRI "typiques", vous pouvez simplement utiliser une expression régulière qui recherche une barre oblique après les barres obliques doubles, par exemple "//.*/". Par exemple:

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 /

Cette réponse est presque certainement correcte, mais elle n'est pas évidente car vous recherchez des noms abrégés.

les opérations suivantes:

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

qui assurera que le nom de l'objet est affiché comme on le voit par la regex. Je suppose que tous vos objets ont des URI commençant http:// ou similaire, et ils vont évidemment correspondre.

+0

La requête que vous m'avez donnée me donne toujours tous les noms (comme vous l'avez noté) puisqu'il y a un // dans le http. Comment puis-je obtenir des noms (c'est-à-dire après l'URL) qui ont une barre oblique? – DRSK

+0

Il n'y a pas de bonne réponse, vraiment, car il n'y a pas de fonction générale qui prend un URI et renvoie un nom court. Une correspondance simple est '[^ /]/[^ /]' (c'est-à-dire une barre oblique voisine de non-barres obliques). – user205512