概要
本記事では、Supply Chain Reference Ontology (SCRO) のサンプルデータとして公開されている SCRO_Ford.ttl
に対し、data.world 上で SPARQL クエリを実行する方法を紹介します。SCRO はサプライチェーン管理におけるオントロジーであり、サンプルデータである SCRO_Ford.ttl
ファイルが下記のように公開されています。本記事では、このデータに対して SPARQL を用いてどのようにクエリを実行できるかを解説します。なお、紹介している SPARQL は動作確認済みですが、最適なクエリである保証はない点に注意してください。
出所:ontology/supplychain/data/SCRO_Ford.ttl at master · iofoundry/ontology
応用的なクエリとしては、「MODELING A SUPPLY CHAIN REFERENCE ONTOLOGY BASED ON A TOP-LEVEL ONTOLOGY」に記載されている、ビジネス上重要な質問に対応するクエリを例示します。ただし、サンプルデータがこれらの質問すべてに答えられる構造にはなっていないため、実行方法が確立できたクエリのみを紹介しています。
- What are the outputs of this supplier in this supply network?
- What types of information does this supplier receive?
- What is the most connected supplier in this supply network?
- What are the first-tier/second-tier suppliers in this network?
- Which supplier provides raw materials in this network?
- What is the path followed by a certain component in this network?
出所:MODELING A SUPPLY CHAIN REFERENCE ONTOLOGY BASED ON A TOP-LEVEL ONTOLOGY
なお、data.world については下記の記事でも紹介しています。
サンプルデータであるSCRO_Ford.ttl
ファイルについて
Supply Chain Reference Ontology (SCRO) の README で、サンプルデータとして紹介されています。
Example RDF Dataset
This dataset represents a hypothetical supply chain as depicted in [this image](https://github.com/iofoundry/ontology/blob/master/supplychain/Documentation & Resources/Terms-Patterns-Modules/Ford Supply Chain.md). The RDF dataset demonstrates how the class "Supply Chain Relationship' is used to represent the strucrue of a supply chain.
- RDF Dataset ======= Additional class diagrams can be found here.
出所:ontology/supplychain/README.md at master · iofoundry/ontology
上記のリンクには誤字があるため、正確には下記 URL からアクセスしてください。
データ構造の概要は画像として公開されています。Ford Motor Company を中心としたサプライチェーンが表現されており、素材メーカーから部品メーカー、システムサプライヤーを経て最終組立の Ford へ部品やモジュールが集約されます。企業名と部品が矢印で結ばれており、矢印の上には納入部材や供給関係の番号が記載されています。
事前準備
data.world にてプロジェクトを作成
下記の記事を参考にプロジェクトを作成してください。
data.world に SCRO のサンプルデータであるSCRO_Ford.ttl
ファイルをアップロード
左上にある + Add
-> Project file
を選択します。
Sync from URL
を選択します。
Source URL
に SCRO_Ford.ttl
ファイルの GitHub URL を入力し、Continue
を選択します。
https://github.com/iofoundry/ontology/blob/master/supplychain/data/SCRO_Ford.ttl
File name
が SCRO_Ford.ttl
になっていることを確認し、Done
を選択します。
サンプルデータがアップロードされていることを確認します。
SPARQL Query の追加
+ Add
-> SPARQL Query
を選択します。
SPARQL Query が表示されることを確認します。
1. 基本的なクエリ
1-1. 組織の一覧を表示
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
SELECT ?org ?label ?properName ?naicsCode ?address
WHERE {
?org a iof-core:BusinessOrganization ;
rdfs:label ?label .
OPTIONAL {
?org iof-core:designatedBy ?nameResource .
?nameResource a iof-scro:ProperName ;
iof-scro:hasTextValue ?properName .
}
OPTIONAL {
?org iof-core:designatedBy ?naicsResource .
?naicsResource a iof-scro:NAICSCode ;
iof-scro:hasTextValue ?naicsCode .
}
OPTIONAL {
?org obo:BFO_0000082 ?location .
?location iof-core:designatedBy ?addrResource .
?addrResource iof-scro:hasTextValue ?address .
}
}
ORDER BY ?org
1-2. 部材の一覧を表示
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX obo: <http://purl.obolibrary.org/obo/>
SELECT ?contract ?partNumber ?modelName
WHERE {
?contract a iof-scro:Contract ;
obo:BFO_0000110 ?prodPart, ?prodModel .
?prodPart a iof-scro:PartNumber ;
iof-scro:hasTextValue ?partNumber .
?prodModel a iof-scro:MaterialArtifactModelName ;
iof-scro:hasTextValue ?modelName .
}
1-3. 契約(Contract)関連のデータを表示
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT
?contract
?relationship
?prodTextModel
?supplierName ?buyerName
WHERE {
?contract a iof-scro:Contract ;
iof-core:prescribes ?relationship .
OPTIONAL {
?contract obo:BFO_0000110 ?part .
?part a iof-scro:PartNumber ;
iof-scro:hasTextValue ?prodTextPart .
}
OPTIONAL {
?contract obo:BFO_0000110 ?model .
?model a iof-scro:MaterialArtifactModelName ;
iof-scro:hasTextValue ?prodTextModel .
}
OPTIONAL {
?relationship obo:BFO_0000195 ?supplierRole .
?supplierRole a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
?supplier iof-core:designatedBy ?supplierNameNode .
?supplierNameNode a iof-scro:ProperName ;
iof-scro:hasTextValue ?supplierName .
}
OPTIONAL {
?relationship obo:BFO_0000195 ?buyerRole .
?buyerRole a iof-core:BuyerRole ;
iof-core:roleOf ?buyer .
?buyer iof-core:designatedBy ?buyerNameNode .
?buyerNameNode a iof-scro:ProperName ;
iof-scro:hasTextValue ?buyerName .
}
}
ORDER BY ?contract
1-4. 供給関係(SupplyRelationship)のデータを表示
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?supplyRel ?buyer ?buyerName ?supplier ?supplierName
WHERE {
?supplyRel a iof-scro:SupplyRelationship ;
rdfs:label ?relLabel .
# 供給者の役割から対象組織と正式名称を取得
?supplyRel obo:BFO_0000195 ?supplierRole .
?supplierRole a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
?supplier iof-core:designatedBy ?supplierNameNode .
?supplierNameNode a iof-scro:ProperName ;
iof-scro:hasTextValue ?supplierName .
# 購入者の役割から対象組織と正式名称を取得
?supplyRel obo:BFO_0000195 ?buyerRole .
?buyerRole a iof-core:BuyerRole ;
iof-core:roleOf ?buyer .
?buyer iof-core:designatedBy ?buyerNameNode .
?buyerNameNode a iof-scro:ProperName ;
iof-scro:hasTextValue ?buyerName .
}
ORDER BY ?supplyRel
2. 応用的なクエリ
2-1. What are the outputs of this supplier in this supply network?
サプライチェーン上であるサプライヤーが提供する製品(部材)を抽出するクエリが考えられます。たとえば ZF North America
( iof-scro:org-0006
)が提供している部品を調べると、Transmission
を特定できれば目的を達成できます。
下記のクエリを実行すると、ZF North America
が提供している Transmission T4
を含む情報を取得できます。
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?supplierName ?modelName ?buyerName
WHERE {
# 指定したサプライヤー(例: iof-scro:org-0006)に関連するサプライヤーロールを取得
?supplierRole a iof-core:SupplierRole ;
iof-core:roleOf iof-scro:org-0006 .
# 同一の供給関係内で、サプライヤーロールとバイヤーロールを取得
?supplyRel obo:BFO_0000195 ?supplierRole ;
obo:BFO_0000195 ?buyerRole .
# 供給関係を規定する契約から、製品情報(部品番号、モデル名)を取得
?contract a iof-scro:Contract ;
iof-core:prescribes ?supplyRel ;
obo:BFO_0000110 ?prodPart, ?prodModel .
# 部品番号の抽出
?prodPart a iof-scro:PartNumber ;
iof-scro:hasTextValue ?partNumber .
# 製品モデル名(製品名)の抽出
?prodModel a iof-scro:MaterialArtifactModelName ;
iof-scro:hasTextValue ?modelName .
# サプライヤー組織の名称を取得
?supplierRole iof-core:roleOf ?supplierOrg .
?supplierOrg iof-core:designatedBy ?supplierNameRes .
?supplierNameRes iof-scro:hasTextValue ?supplierName .
?supplierNameRes a iof-scro:ProperName .
# バイヤー組織の名称を取得
?buyerRole a iof-core:BuyerRole ;
iof-core:roleOf ?buyerOrg .
?buyerOrg iof-core:designatedBy ?buyerNameRes .
?buyerNameRes iof-scro:hasTextValue ?buyerName .
?buyerNameRes a iof-scro:ProperName .
}
2-2. What are the first-tier/second-tier suppliers in this network?
ある組織に直接納品しているサプライヤーを first-tier とし、そのサプライヤーにさらに納品している組織を second-tier と定義できます。Ford を基準とすると、3 社が first-tier、4 社が second-tier にあたります。
下記のクエリで、Ford の first-tier および second-tier サプライヤーを抽出できます。
PREFIX iof-scro: <https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/>
PREFIX iof-core: <https://spec.industrialontologies.org/ontology/core/Core/>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?baseOrgName ?supplier ?supplierName ?tier
WHERE {
# ベース組織 (Ford Motor Company) の名称を取得
iof-scro:org-0001 rdfs:label ?baseOrgName .
{
# ファーストティア(一次)サプライヤー: Fordに直接供給している企業
?supplyRel a iof-scro:SupplyRelationship ;
obo:BFO_0000195 ?roleA, ?roleB .
{
?roleA a iof-core:BuyerRole ;
iof-core:roleOf iof-scro:org-0001 .
?roleB a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
}
UNION
{
?roleB a iof-core:BuyerRole ;
iof-core:roleOf iof-scro:org-0001 .
?roleA a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
}
BIND("first-tier" AS ?tier)
OPTIONAL { ?supplier rdfs:label ?supplierName . }
}
UNION
{
# セカンドティア(二次)サプライヤー: まずFordに直接供給している一次サプライヤーを抽出し、
# その一次サプライヤーに供給している企業を取得
{
SELECT DISTINCT ?firstTierSupplier
WHERE {
?supplyRel1 a iof-scro:SupplyRelationship ;
obo:BFO_0000195 ?roleC, ?roleD .
{
?roleC a iof-core:BuyerRole ;
iof-core:roleOf iof-scro:org-0001 .
?roleD a iof-core:SupplierRole ;
iof-core:roleOf ?firstTierSupplier .
}
UNION
{
?roleD a iof-core:BuyerRole ;
iof-core:roleOf iof-scro:org-0001 .
?roleC a iof-core:SupplierRole ;
iof-core:roleOf ?firstTierSupplier .
}
}
}
?supplyRel2 a iof-scro:SupplyRelationship ;
obo:BFO_0000195 ?roleE, ?roleF .
{
?roleE a iof-core:BuyerRole ;
iof-core:roleOf ?firstTierSupplier .
?roleF a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
}
UNION
{
?roleF a iof-core:BuyerRole ;
iof-core:roleOf ?firstTierSupplier .
?roleE a iof-core:SupplierRole ;
iof-core:roleOf ?supplier .
}
BIND("second-tier" AS ?tier)
OPTIONAL { ?supplier rdfs:label ?supplierName . }
}
}
次にやるべきこと
SCRO の Taxonomy の全体像を理解
出所:ontology/supplychain/README.md at master · iofoundry/ontology
IOF Ontology のページの理解
出所:IOF