2016-06-21 11 views
1

Ich versuche SPARQL-Abfrage zu bilden, die Domainnamen und Methodenname gegen die angegebene Java-Klasse von unten RDF geben wird. Zum BeispielSPARQL select Abfrage mit Bedingung?

Wählen Sie DomainNames, MethodName wo JavaClass = 'MyJavaClass'. Dies ist nur eine Pseudo-Abfrage. Ich brauche Hilfe bei der Bildung einer ähnlichen Abfrage in SPARQL. Vielen Dank.

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:DOL="http://www.MyOnt.com/something/v1#" 
    xmlns:DC="http://purl.org/dc/dcmitype/" 
    xmlns:foaf="http://xmlns.com/foaf/0.1/"> 
    <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyJavaClass"> 
    <DOL:belongsTo> 
     <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyDomain"> 
     <DOL:domainName>MyDomainValue2</DOL:domainName> 
     <DOL:domainName>MyDomainValue</DOL:domainName> 
     </rdf:Description> 
    </DOL:belongsTo> 
    <DOL:hasMethod> 
     <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyMethod"> 
     <DOL:returnType>MethodReturnType</DOL:returnType> 
     </rdf:Description> 
    </DOL:hasMethod> 
    <foaf:name>MyJavaClass</foaf:name> 
    </rdf:Description> 
</rdf:RDF> 

Antwort

2

Es ist in der Regel einfacher zu verstehen, was die SPARQL-Abfrage aussehen sollte, wenn Sie zuerst die Daten in Turtle setzen, die eine Syntax sehr ähnlich SPARQL hat. Hier ist, was Ihre Daten in Turtle ist:

@prefix DOL: <http://www.MyOnt.com/something/v1#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix foaf: <http://xmlns.com/foaf/0.1/> . 
@prefix DC: <http://purl.org/dc/dcmitype/> . 

<http://www.MyOnt.com/something/data/MyDomain> 
     DOL:domainName "MyDomainValue2" , "MyDomainValue" . 

<http://www.MyOnt.com/something/data/MyJavaClass> 
     DOL:belongsTo <http://www.MyOnt.com/something/data/MyDomain> ; 
     DOL:hasMethod <http://www.MyOnt.com/something/data/MyMethod> ; 
     foaf:name  "MyJavaClass" . 

<http://www.MyOnt.com/something/data/MyMethod> 
     DOL:returnType "MethodReturnType" . 

Sobald Sie das getan haben, sieht die Abfrage fast genau wie die Daten, außer mit Variablen in ihm. Der einzige Haken hier ist, dass Sie, da Sie nach Domänen und Methoden suchen, eine Union verwenden müssen (vorausgesetzt, dass Sie Domänen und Methoden als verschiedene Variablen binden möchten).

prefix DOL: <http://www.MyOnt.com/something/v1#> 
prefix foaf: <http://xmlns.com/foaf/0.1/> 

select ?domain ?method { 
    ?class foaf:name "MyJavaClass" . 
    { ?class DOL:belongsTo ?domain } 
    union 
    { ?class DOL:hasMethod ?method } 
} 
--------------------------------------------------------------------------------------------------- 
| domain           | method           | 
=================================================================================================== 
| <http://www.MyOnt.com/something/data/MyDomain> |            | 
|            | <http://www.MyOnt.com/something/data/MyMethod> | 
--------------------------------------------------------------------------------------------------- 

Wenn Sie bereit sind, die Domäne und Verfahren auf die gleiche Variable gebunden haben, können Sie einen Wechsel Eigenschaft Pfad zu wählen entweder eine Domäne oder eine Methode verwenden:

prefix DOL: <http://www.MyOnt.com/something/v1#> 
prefix foaf: <http://xmlns.com/foaf/0.1/> 

select ?domainOrMethod { 
    ?class foaf:name "MyJavaClass" ; 
     DOL:belongsTo|DOL:hasMethod ?domainOrMethod 
} 

Als weitere Alternative könnten Sie einen Werte Block verwenden, um die Eigenschaften anzugeben, denen Sie folgen möchten (hasMethod oder belongsTo), in dem Fall, dass Sie das auch, um wählen wissen, welche Art von Wert, den Sie haben:

prefix DOL: <http://www.MyOnt.com/something/v1#> 
prefix foaf: <http://xmlns.com/foaf/0.1/> 

select ?property ?value { 
    values ?property { DOL:belongsTo DOL:hasMethod } 
    ?class foaf:name "MyJavaClass" ; 
     ?property ?value 
} 
------------------------------------------------------------------ 
| property  | value           | 
================================================================== 
| DOL:belongsTo | <http://www.MyOnt.com/something/data/MyDomain> | 
| DOL:hasMethod | <http://www.MyOnt.com/something/data/MyMethod> | 
------------------------------------------------------------------ 
+1

Das Problem, das ich sehe, ist vor allem, dass viele Menschen hier tun versuche nicht, zumindest einige SPARQL-Grundlagen zu lernen oder zu verstehen. Es ist viel Aufwand und gute Arbeit von Ihrer Seite, aber ich denke nicht, dass die nächste Abfrage von selbst geschrieben werden kann. – AKSW

+0

@Joshua: Danke für Ihre ausführliche Erklärung. Es hat in der Tat viel geholfen. Mein Ziel war es, Domain-Werte sowie Rückgabetyp anzuzeigen. Ich habe Ihre Anfrage geändert und die gewünschten Ergebnisse erhalten. Tatsächlich behielt ich Ihre Anfrage gleich und fügte zwei weitere Variablen hinzu: "dValues" und "rType". Es funktioniert gut, aber ich verstehe nur nicht, dass ich verschiedene Variable für beide der oben genannten Variablen verwenden müssen: Hier ist eine der Code-Schnipsel: '{? Class2 DOL: domainName? DValues}' Es funktioniert, wenn Ich benutze "class2", arbeite aber nicht mit "class". Es sieht so aus, als ob "Klasse" bereits definiert ist und dies zu Konflikten führt. – Viki