12

これにはおそらく簡単に答えることができますが、それを見つけるために Google クエリを作成する方法さえわかりません。

空白のノードを含むデータセットに対して SPARQL コンストラクト クエリを作成しています。したがって、次のようなクエリを実行すると

CONSTRUCT {?x ?y ?z .} WHERE {?x ?y ?z .}

次に、私の結果の1つは次のようになります。

nm:John nm:owns _:Node

すべての場合、これは問題です

_:Node nm:has nm:Hats

トリプルも何らかの形でクエリ結果に入りません(Pythonのrdflibのように使用している一部のパーサーは、ぶら下がっているbノードを本当に好まないためです)。

元の CONSTRUCT クエリを記述して、新しいグラフに bnode がぶら下がったままにならないように、任意の bnode 結果に関連付けられたすべてのトリプルを再帰的に追加する方法はありますか?

4

3 に答える 3

11

再帰は不可能です。私が考えることができる最も近いものは、SPARQL 1.1 プロパティ パスです (注: そのバージョンは古くなっています) が、bnode テストは利用できません (私の知る限り)。

末尾の bnode を含むステートメントを削除するだけです。

CONSTRUCT {?x ?y ?z .} WHERE 
{
  ?x ?y ?z .
  FILTER (!isBlank(?z))
}

または、次のビットを取得して運を試してください:

CONSTRUCT {?x ?y ?z . ?z ?w ?v } WHERE 
{
  ?x ?y ?z .
  OPTIONAL {
    ?z ?w ?v
    FILTER (isBlank(?z) && !isBlank(?v))
  }
}

(最後のクエリはかなり罰せられます、ところで)

多くの場合、 bnodeDESCRIBEをスキップします。

于 2012-03-20T10:19:50.793 に答える
3

user205512が示唆しているように、そのグラブを再帰的に実行することは不可能であり、彼らが指摘しているように、オプションを使用してデータに任意のレベルを下げ、ノードを取得することは、重要なサイズのデータ​​ベース以外では実行できません。

Bnode自体は、ローカルスコープ、結果セット、またはファイルにスコープされます。BNodeが解析から取得されるか、結果セットから取得されるかは、データベースで使用されているIDと同じであるという保証はありません(ただし、一部のデータベースでは、クエリ結果に対してこれが保証されます)。さらに、「select?s where {?s?p _:bnodeid1}」のようなクエリは、「select?where {?s?p?o}」と同じです。この場合、bnodeは変数として扱われることに注意してください。 、「id'bnodeid1'のあるもの」ではありません。この設計の癖により、bnodeのクエリが困難になるため、データを管理している場合は、bnodeを使用しないことをお勧めします。そうでなければbnodeになるものの名​​前を生成することは難しくありません。また、名前付きリソースv。bnodeは、クエリ中のオーバーヘッドを増加させません。

これは、データを繰り返し取得するのに役立ちませんが、そのために、このような一般的なクエリを実行することはお勧めしません。それらは適切にスケーリングせず、通常、必要以上に返されます。もっと指示されたクエリを実行することをお勧めします。元の構成クエリはデータベース全体のコンテンツをプルダウンしますが、これは通常、必要なものではありません。

最後に、describeは便利ですが、標準の実装はありません。SPARQL仕様は特定の動作を定義していないため、返されるものはデータベースベンダーに委ねられており、異なる場合があります。これにより、アプリケーションでさまざまなデータベースを試すことを計画している場合、コードの移植性が低下する可能性があります。説明から外れた特定の動作が必要な場合は、自分で実装することをお勧めします。リソースの簡潔な制限付き記述のようなことを行うのは簡単なコードですが、Bnodeの周りでいくつかの頭痛の種に遭遇する可能性があります。

于 2012-03-20T15:32:35.183 に答える
1

RDF::Graph オブジェクトで重要な便利なメソッドを使用して SPARQL クエリを実行できる ruby​​ RDF.rb ライブラリの操作に関しては、次のように空白ノードを展開する必要があります。

rdf_type = RDF::SCHEMA.Person # for example
rdf.query([nil, RDF.type, rdf_type]).each_subject do |subject|
  g = RDF::Graph.new
  rdf.query([subject, nil, nil]) do |s,p,o|
    g << [s,p,o]
    g << rdf_expand_blank_nodes(o) if o.node?
  end
end

def rdf_expand_blank_nodes(object)
  g = RDF::Graph.new
  if object.node?
    rdf.query([object, nil, nil]) do |s,p,o|
      g << [s,p,o]
      g << rdf_expand_blank_nodes(o) if o.node?
    end
  end
  g
end
于 2015-02-21T03:39:44.453 に答える