or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
Wikidata 入門筆記 2 - Query with SPARQL
tags:
Wikidata
Style - Wikidata
(以書本模式瀏覽)
前言
在這個單元裡,將會介紹一些 SPARQL 的語法
雖然內容很長,但你不需要一口氣讀完
就算只讀懂第一個範例,也可以玩很多有趣的 query 了
可以之後再根據需求回來找找有沒有好用的語法
參考連結
基本語法
Example : House Cat with Picture
這是內建範例的其中一個拿來改的
用來查詢所有有圖片的家貓(Q146)
[Open in Query]
#
開頭是單行註解SELECT
?item
,?pic
?
開頭表示是一個變數(跟php的$
類似)?itemLabel
只有在 Label Service 被開啟時會被解釋成 Label
WHERE{...}
wdt:
,wd:
wdt:
是用來標示 Property 的前綴wd:
是用來標示 Item 的前綴後面會詳細介紹
如果一個項目沒有 P31 屬性或是 P31 的值不是 Q146 就會被排除掉
注意一個敘述的結尾要加句號('.')
如果一個項目沒有 P18(圖片) 屬性則會被排除
若有則該物件會被放到 item,其圖片會被放到 pic
把有
Label
後綴的變數轉換成對應的 Label語言選擇可以參考 這張表格
變數
變數以
?
開頭跟程式語言的變數一樣,名稱可以自己取
不需要事先宣告
SELECT
後面寫的也不算是宣告,而是指定最後要回傳哪些變數前綴 (Prefix)
根據原本 RDF 的用法,Item, Property, Value 都是 URI 格式
一個 triple 可能寫成這樣
而 Prefix 可以幫助我們縮短冗長的描述
Wikidata 提供了一大堆前綴
每個前綴有不同的意義
最常用的就是標示項目的 wd 和標示屬性的 wdt
用法就像前面的範例 code 一樣
條件的運作方式
WHERE{…} 裡的條件每句都要符合才會被取出。
可以想像成枚舉資料庫裡的所有東西,試著代進變數裡面
然後一句一句看是否符合,符合就取出,不符合就再試下一組
Label
以下介紹兩種取得 label 的方式
rdfs:label
這個語法很容易寫出超時的 query
請加一些嚴格的條件 (例如性質:河流) 避免需要篩選的項目太多
如果只有第一行,會列出所有不同語言的 label
第二行的 filter 是用來篩選特定語言
如果要查詢擁有指定 label 的項目,你必須指定想要的語言
例如查詢名為"淡水河"的項目:
@後面加上語言代碼,這個東西叫做 language tag
如果把 language tag 移除是搜不到任何東西的
Label Service
引號("")內填入一個或多個 language code
如果找不到第一個語言的 label 就會使用第二個,依此類推
[AUTO_LANGUAGE]
則會被自動轉換成當前 Query 頁面的語言其他的則參考 Mediawiki Language Code
中文的 Label
Mediawiki 有自己一套 language code
大致上跟 ISO 的一樣,但是中文的部分就很雜
以下是我常用的 Language Code
Limit
在
WHERE{ ... }
後面 加上LIMIT <number>
就可以限制查詢的數量例如要限制最多 100 條結果:
選擇性的取值
有時候我們會希望一個屬性存在時就取出,沒有就算了
這時候可以用
OPTIONAL{}
把敘述包起來例如貓咪的例子可以改成這樣
Qualifier
一般 Qualifier
有時候一個屬性有多個 Value
我們需要能透過判斷 qualifier 來篩選需要的東西
這時候就會用到 p,ps,pq
p = property
ps = property / statement
pq = property / qualifier
Example - 蒙娜麗莎所用的材料
第 1 行用
p:
取代wdt:
這時取出來的變數
?statement1
就不會是單一個 value而是一個稱為 claim 或是 statement node 的結構
一個 claim 由一個 property、一個 value、和一些 qualifier 組成
(但不含references)
第 2 行:「
?statement1
的 value 就是 Q291034」用
ps:
來取 valueps:
後面也只能和前面p:
一樣放 P186 了,不然就一定沒東西符合條件因為經過第一行後
?statement1
只有可能有 P186 的 statement 的內容第 3 行:「
?statement1
有個 qualifier P518 ,其值為 Q291034」用
pq:
來取 qualifier上面的 code 只是示範語法,並不能 query 什麼
以下是稍微改了一下之後的幾種用法
更多語法
SPARQL 還有很多語法可以幫助簡化敘述
在排版得當的情況下也更容易閱讀其中的邏輯
取出所有提到過的變數 ( * )
跟正規表達式一樣使用
*
這樣
{ }
裡面提到的任何變數都會被放在查詢結果裡分號 ( ; )
用前面的貓咪例子來講
我們經常會有主詞(subject)相同的狀況
這時候可以用
;
來簡化逗號 ( , )
有時候不只主詞,Property 也相同
例如想查詢有那些畫使用 油彩(Q296955) 和 金箔(Q929186) 做為材質(P186)
[Open in Query]
可以簡寫成
另一種排版方式:
路徑 ( / )
可以簡化成
匿名變數 ( [ ] )
可以簡化成
重複多次 ( * + )
*
可以表示一個路徑重複 0 次或多次+
可以表示一個路徑重複 1 次或多次例如
可以找到所有 藝術品(Q735) 或其子類別的 instance
或 ( | )
原文
這個例子是用來找 約翰·塞巴斯蒂安·巴赫 的後代
藉由查詢 父母、父母的父母、父母的父母的父母 …
只要其中一個是 約翰·塞巴斯蒂安·巴赫,那他就是巴赫的後代了
(wdt:P22|wdt:P25)+
就是一個以上的 P22 和 P25 的隨意組合DataModel & DataType
施工中
Data Model
連結
Data Type
連結
列表
value 裡可以放各種不同類型的資料
這些類型我們稱之為 data type
目前有這些 data types
以下介紹一些和 data type 有關連的東西
Quantity 和單位轉換
在 Wikidata 裡單位轉換有點小麻煩
quantity 的組成大致長這樣:
\(\qquad\)
amount [lower_bound] [upper_bound] unit
amount 是主要的值
lower_bound 和 upper_bound 是可選的下界和上界
用來描述不確定範圍的值
unit 是一個網址,指向一個記載單位的 item(這裡的其中一個)
如果填入1,表示沒有單位(因次為1)
範例
暫時放個範例和一些連結
這段範例是從 這篇文章 出來的
BIND
BIND 的基本格式:
BIND(expression AS ?variable)
可以把 expression 的值指定給 ?variable
expression 中是可以進行 +,-,*,/ 運算的
IF
IF 的基本格式:
IF(condition,thenExpression,elseExpression)
延伸閱讀
https://www.wikidata.org/wiki/Wikidata:Units
https://www.mediawiki.org/w/index.php?title=Wikibase/DataModel#Quantities
巨大範例
附上一個我實際用到的 Query
Open in Query
,?creator
是因為我希望在指定作者的同時也要顯示作者名字排序
以查詢政黨編號為例