2016-06-29 6 views
0

ich einen SPARQL Query-String aus einem Dienst erhalten, die wie die folgenden Abfrage aussieht:Ersetzen gelegten Namen mit URIs in SPARQL Abfrage, die keine Präfixe hat

SELECT * FROM { ?s owl:sameAs ?p } 

Wenn ich versuche, das ich mit der QueryFactory Klasse zu analysieren bekommen das Unresolved Prefixed Name Exception was total sinnvoll ist.

Ich habe eine Eigenschaftendatei, die die predefined namespace prefixes abbildet.

Für jetzt habe ich eine Abhilfe, die wie folgt aussieht:

Iterator<String> it = prefixConfig.getKeys(); 
String prefixes = ""; 
while(it.hasNext()) { 
    String p = it.next(); 
    prefixes += "PREFIX " + p + ":<" + prefixConfig.getString(p) + "> "; 
} 

Query q = QueryFactory.create(prefixes + query); 
it = prefixConfig.getKeys(); 
while(it.hasNext()) { 
    String p = it.next(); 
    q.getPrefixMapping().removeNsPrefix(p); 
} 

query = q.toString(); 

Dies funktioniert, aber ich bin nicht glücklich mit dieser Lösung, so meine Frage ist:

Gibt es eine Gute Möglichkeit, entweder die Präfixe in der SPARQL-Abfragezeichenfolge zu ersetzen oder nur die relevanten Präfixe hinzuzufügen?

Vielen Dank im Voraus!

+1

Ich weiß nicht, ob dies funktionieren wird oder nicht, so dass ich bin Entsendung es nicht als Antwort, aber QueryFactory # create() wird eine Abfrage machen mit Keine Analyse, und wird eine Abfrage zurückgeben, die über eine setPrefixMapping() -Methode verfügt, mit der Sie möglicherweise die Präfixe festlegen und anschließend möglicherweise die Abfragezeichenfolge analysieren können. –

+0

Nun, aber ich muss entweder die Abfragezeichenfolge für die Präfixe analysieren und dann die benötigten Präfixe hinzufügen oder alle Präfixe hinzufügen und einfach dasselbe tun:/ Aber ich denke, ich werde mit dem Parsing für jetzt gehen, wie es besser ist Weg. – TortugaAttack

+0

Wie gesagt, ich bin mir nicht sicher, ob es eine Antwort gibt oder nicht. Aber Sie können das Präfix-Mapping nicht erstellen und bekommen, dass jena es in die richtige Art von String für Sie umwandelt, die alle möglichen Fehler bei der Erstellung von Hand entfernen würde –

Antwort

0
public static String replacePrefixes(String query, PrefixMapping pmap){ 
    /* With Prologue and the parse method, 
    * the queryString gets parsed without an error 
    */ 
    Prologue prog = new Prologue(); 
    prog.setPrefixMapping(pmap); 
    Query q = QueryFactory.parse(new Query(prog), query, null, null); 
    //Set Prefix Mapping 
    q.setPrefixMapping(pmap); 
    //remove PrefixMapping so the prefixes will get replaced by the full uris 
    q.setPrefixMapping(null);  
    return q.serialize(); 
} 

Dies funktioniert für mich :)

Verwandte Themen