2

私はRDFを使用して新しいプロジェクトに取り組んでおり、RDFとSPARQLを学んでいます。このクエリは、実際よりも簡単になると思いました。

このストアが与えられた場合 (オントロジーから簡略化)

Person1 -Owns->  Part1
Person2 -Owns->  Part1
Person2 -Owns->  Part2
Part1 -PartOf-> Product1
Part2 -PartOf-> Product1

人が製品を完成させるために必要なすべての部品を返品しようとしています.

Person1 の場合、Product1 の作成を完了するには Part2 が必要です。Person2 が与えられた場合、Product1 を作成するためのすべての部品を持っているので、彼には何も必要ありません。

1 回のクエリですべての人と各製品に必要なすべての部品を返したいと思いますが、特定の人が必要とする部品を見つけようとして、より小さく始めようと考えました。実際のデータには、複数の製品と、複数の製品に含まれる可能性のある部品 (つまり、ネジは多くの製品に含まれる) と、複数の製品の一部である部品を所有する人物が含まれます。サブセット クエリを機能させることができたら、それを拡張できるはずです。

select ?parts
where 
{ 
  ?parts <PartOf> <Product1> .
  minus {<Person1> <Owns> ?parts}
}

私が考えたのは、Product1 の一部であるすべてのパーツを取得してから、Person1 が所有するパーツを削除することでした。しかし、Product1 のすべてのパーツを取得しています。他の多くのクエリを試しましたが、チュートリアルや本を読んだ後、これが最も理にかなっています。誰かが私が間違っているところを指摘できますか?

御時間ありがとうございます。

4

1 に答える 1

2

使用しているクエリ ソフトウェアと、実際のデータはどのようなものですか? apache jenaを使用して次のことを試しました:

@prefix ex: <http://example.com/> .

ex:person1 ex:owns ex:part1 .
ex:person2 ex:owns ex:part1 .
ex:person2 ex:owns ex:part2 .

ex:part1 ex:partOf ex:product1 .
ex:part2 ex:partOf ex:product1 .

そしてクエリ:

prefix ex: <http://example.com/>

select ?parts
where
{
    ?parts ex:partOf ex:product1
    minus { ex:person1 ex:owns ?parts }
}

結果:

$ arq --data data.ttl --query query.rq 
------------
| parts    |
============
| ex:part2 |
------------

作成した内容を考えると、クエリ ソフトウェアにバグがある (可能性がある) 可能性がありますが、データまたはクエリに単純なタイプミスがある可能性が高くなります。(たとえば) 'Owns' ではなく 'owns' (小文字) があった場合、それは結果を説明します。

{<Person1> <Owns> ?parts}単独で実行してみてください。結果は出ていますか?クエリが返すパーツと一致するものはありますか?

于 2013-03-19T16:04:23.220 に答える