2017-07-11 2 views
0

Ich muss eine Schleife ausführen, die die Beschriftungen aller Nachbarknoten aller Klassen einer RDF-Ontologie mithilfe von SPARQL-Abfragen in RDFLIB abruft. Ich weiß, wie die Klassen erhalten:Übergabe der Python-Variablen in SPARQL Abfrage

classes=graph.query("""select ?nodes WHERE { 
?nodes rdf:type owl:Class 
} limit 100""") 

Und ich weiß, wie man die Nachbarknoten eines einzelnen URI zu erhalten:

example = graph.query("""select ?othernodes ?othernodesLabel where { 
bind (<http://human.owl#NCI_C12736> as ?mynode) 
    ?mynode ?y ?othernodes. 
    ?othernodes rdfs:label ?othernodesLabel 
} limit 100""") 

Aber was ich brauche, ist diese zusammen in einer for-Schleife zu setzen Dadurch werden alle Beschriftungen der benachbarten Knoten jeder Klasse in einem Objekt gruppiert, sodass für jede Klasse eine Liste mit den Beschriftungen aller angrenzenden Knoten vorhanden ist.

+1

Können Sie nicht einfach eine kombinierte Abfrage verwenden und die Beschriftungen für jede Klasse in der Python-Anwendung behandeln? Ansonsten besteht die einzige Möglichkeit darin, die Labels nach Klassen zu gruppieren und zu verketten, was bedeutet, dass Sie das Ergebnis später trotzdem verarbeiten müssen. – AKSW

+0

Das würde funktionieren, aber wie würde man diese Art kombinierter Abfrage in SPARQL machen? – Boris

+1

Nun, verwenden Sie einfach das erste dreifache Muster in der zweiten Abfrage? – AKSW

Antwort

1

Wenn ich Ihre Frage richtig verstanden habe, wäre die einfachste Lösung, beide Abfragen zu kombinieren und die Etiketten über Python-Code zu verarbeiten. Die Abfrage wäre

SELECT ?node ?othernodes ?othernodesLabel WHERE { 
    ?node rdf:type owl:Class . 
    ?node ?y ?othernodes . 
    ?othernodes rdfs:label ?othernodesLabel 
} 
LIMIT 100 

In Ihrem Code können Sie dann die zurückgegebenen Daten pro OWL-Klasse verarbeiten. In der Tat müssen Sie immer noch die Ergebnismenge durchlaufen, daher ähnelt es der Schleife über dem Ergebnis Ihrer ersten Abfrage und führt die zweite Abfrage für jede Klasse aus.

+0

Dank AKSW, das einzige Problem mit dem Code, den Sie veröffentlicht haben, ist, dass es alle Beschriftungen aller angrenzenden Klassen als ein Objekt zurückgibt, und ich bin mir nicht sicher, wie man die zurückgegebenen Daten für jede Klasse trennt. Der Grund dafür ist, dass ich nicht weiß, wie man eine Python-Variable in eine SPARQL-Abfrage übergibt. Gibt es eine Möglichkeit, zum Beispiel eine for-Schleife auszuführen und für jede Klasse ein eigenes Label zu haben? – Boris

+1

Was meinst du mit "als ein Objekt"? Sie erhalten eine Art von Zeilen zurück und jede Zeile enthält 'Knoten, related node, label of related node'. Warum können Sie nicht einfach die Zeilen durchlaufen und dann die Daten pro Klasse gruppieren? – AKSW

+0

Das würde funktionieren, aber müsste ich das in Python oder innerhalb einer SPARQL-Abfrage tun? – Boris