2017-07-11 12 views
0

rdflibのSPARQLクエリを使用して、rdfオントロジーのすべてのクラスのすべての隣接ノードのラベルを取得するループを実行する必要があります。SPARQLクエリでPython変数を渡す

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

そして私は、単一のURIの隣接ノードを取得する方法を知っている:私は、クラスを取得する方法を知っている

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

しかし、私に必要なのは、forループで一緒にこれらを置くことです1つのオブジェクト内の各クラスの隣接するノードのすべてのラベルをグループ化します。その結果、すべてのクラスに対して、隣接するすべてのノードのラベルを含むリストが作成されます。

+1

組み合わせクエリを使用して、Pythonアプリケーションの各クラスのラベルを処理することはできませんか?それ以外の場合、唯一の選択肢は、クラス別にグループ化してラベルを連結することです。これは後で結果を処理する必要があることを意味します。 – AKSW

+0

これはうまくいくが、SPARQLでどのようにこのタイプの結合クエリを実行するのだろうか? – Boris

+1

さて、2番目のクエリで最初のトリプルパターンを使用するだけですか? – AKSW

答えて

1

私があなたの質問を正しく理解していれば、最も簡単な解決策は両方のクエリを組み合わせて、ラベルをPythonコードで処理することです。クエリは

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

になります。コードでは、返されたデータを各OWLクラスごとに処理できます。実際には、まだ結果セットをループする必要があります。したがって、最初のクエリの結果をループして各クラスの2番目のクエリを実行するのと似ています。

+0

ありがとうございますAKSW、あなたが投稿したコードの唯一の問題は、すべての隣接するクラスのすべてのラベルを1つのオブジェクトとして返し、各クラスごとに返されるデータをどのように分離するのか分かりません。これは、Python変数をSPARQLクエリに渡す方法がわからないためです。たとえば、for-loopを実行し、各クラスのラベルの別個のオブジェクトを持つ方法がありますか? – Boris

+1

「1つのオブジェクトとして」はどういう意味ですか?ある種の行を戻し、各行には「ノード、関連ノード、関連ノードのラベル」が含まれています。単純に行をループしてクラスごとにデータをグループ化できないのはなぜですか? – AKSW

+0

それはうまくいくが、私はPythonやSPARQLクエリの中でそれをしなければならないだろうか? – Boris