Obsidianで[[ベースの作成|ベースを作成]]すると、`.base`ファイルとして保存されます。ベースは通常アプリのインターフェースを使って編集しますが、構文を手動で編集したり、コードブロックに埋め込んだりすることもできます。
[[Basesの紹介|Bases]]構文は[[ビュー]]、フィルター、[[数式]]を定義します。ベースは以下に定義されたスキーマに準拠する有効なYAMLである必要があります。
## 例
以下はベースファイルの例です。各セクションについて詳しく説明していきます。
```yaml
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
formulas:
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
ppu: "(price / age).toFixed(2)"
properties:
status:
displayName: Status
formula.formatted_price:
displayName: "Price"
file.ext:
displayName: Extension
summaries:
customAverage: 'values.mean().round(3)'
views:
- type: table
name: "My table"
limit: 10
groupBy:
property: note.age
direction: DESC
filters:
and:
- 'status != "done"'
- or:
- "formula.ppu > 5"
- "price > 2.1"
order:
- file.name
- file.ext
- note.age
- formula.ppu
- formula.formatted_price
summaries:
formula.ppu: Average
```
### フィルター
デフォルトでは、ベースは保管庫内のすべてのファイルを含みます。SQLやDataviewのような`from`や`source`はありません。`filters`セクションでは、データセットを絞り込むための条件を定義できます。
```yaml
# シンプルなフィルター:
filters:
and:
- file.hasTag("tag")
# 複雑なフィルター:
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
```
フィルターを適用できる箇所は2つあります:
1. グローバルな`filters`レベル(上記に表示)で、ベース内のすべてのビューに適用されます。
2. `view`レベルで、特定のビューにのみ適用されます。
これら2つのセクションは機能的に同等であり、ビューの評価時には`AND`で結合されます。
`filters`セクションには、文字列としての単一のフィルターステートメント、または再帰的に定義されたフィルターオブジェクトのいずれかを含めることができます。フィルターオブジェクトには`and`、`or`、`not`のいずれかを含めることができます。これらのキーは、他のフィルターオブジェクトまたは文字列のフィルターステートメントの混合リストです。フィルターステートメントは、ノートに適用されたときに真偽値に評価される行です。以下のいずれかになります:
- 標準的な算術演算子を使用した基本的な比較。
- 関数。さまざまな[[関数]]が組み込まれており、プラグインで追加の関数を追加できます。
フィルターと数式の構文および利用可能な関数は同じです。
### 数式
`formulas`セクションでは、ベースファイル内のすべてのビューで表示できる[[数式|数式プロパティ]]を定義します。
```yaml
formulas:
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
ppu: "(price / age).toFixed(2)"
```
数式プロパティは基本的な算術演算子とさまざまな組み込み[[関数]]をサポートしています。将来的には、プラグインが数式で使用する関数を追加できるようになります。
プロパティの種類に応じて、異なる方法で参照できます:
- **ノートプロパティ**はノートのフロントマターで定義されたプロパティです。例えば`note.price`や`note["price"]`です。
プレフィックスが指定されていない場合、プロパティは`note`プロパティと見なされます。
- **ファイルプロパティ**はファイル自体を記述します。
例えば`file.size`や`file.ext`です。ファイルオブジェクトを直接参照することもできます(例:`file.hasLink()`)。
- **数式プロパティ**はベース内の他の数式です。
例えば`formula.formatted_price`です。
数式は他の数式プロパティの値を使用できますが、循環参照がない場合に限ります。
数式プロパティはYAMLでは常に文字列として格納されますが、実際の**出力データ型**は基礎となるデータの型と使用される関数の戻り値によって決まります。
YAMLフィールドにテキストリテラルを含めるには、ネストされた引用符が必要であることに注意してください。テキストリテラルはシングルクォートまたはダブルクォートで囲む必要があります。
### プロパティ
`properties`セクションでは、各プロパティに関する設定情報を格納できます。これらの設定値の使用方法は個々のビューに依存します。例えば、表では表示名が列ヘッダーに使用されます。
```yaml
properties:
status:
displayName: Status
formula.formatted_price:
displayName: "Price"
file.ext:
displayName: Extension
```
表示名はフィルターや数式では使用されません。
### 要約
`summaries`セクションは、カスタム要約数式を定義するために使用できます。ここで要約数式を定義するだけでなく、いくつかのデフォルトの要約数式も利用可能です。
```yaml
summaries:
customAverage: 'values.mean().round(3)'
```
この例では、`customAverage`数式はデフォルトの`Average`と同じですが、値は異なる桁数に丸められます。要約数式では、`values`キーワードは結果セット内のすべてのノートにわたるそのプロパティのすべての値を含むリストです。要約数式は単一の`Value`を返す必要があります。
この`summaries`セクションは、ビュー設定内の`summaries`セクション(以下で説明)とは異なることに注意してください。ビュー設定では、要約数式が特定のプロパティに割り当てられます。
#### デフォルトの要約数式
| 名前 | 入力型 | 説明 |
| --------- | ---------- | ------------------------------------------------------------- |
| Average | Number | 入力値のすべての数値の算術平均。 |
| Min | Number | 入力値の最小の数値。 |
| Max | Number | 入力値の最大の数値。 |
| Sum | Number | 入力のすべての数値の合計。 |
| Range | Number | `Max`と`Min`の差。 |
| Median | Number | 入力値のすべての数値の中央値。 |
| Stddev | Number | 入力値のすべての数値の標準偏差。 |
| Earliest | Date | 入力値の最も早い日付。 |
| Latest | Date | 入力値の最も遅い日付。 |
| Range | Date | `Latest`と`Earliest`の差。 |
| Checked | Boolean | `true`値の数。 |
| Unchecked | Boolean | `false`値の数。 |
| Empty | Any | 入力中の空の値の数。 |
| Filled | Any | 入力中の空でない値の数。 |
| Unique | Any | 入力中のユニークな値の数。 |
### ビュー
`views`セクションでは、データのレンダリング方法を定義します。`views`リストの各エントリは同じデータの個別のビューを定義し、必要に応じていくつでも異なるビューを作成できます。
```yaml
views:
- type: table
name: "My table"
limit: 10
groupBy:
property: note.age
direction: DESC
filters:
and:
- 'status != "done"'
- or:
- "formula.ppu > 5"
- "price > 2.1"
order:
- file.name
- file.ext
- note.age
- formula.ppu
- formula.formatted_price
summaries:
formula.ppu: Average
```
- `type`は組み込みおよびプラグインで追加されたビュータイプから選択します。
- `name`は表示名で、デフォルトビューの定義に使用できます。
- `filters`は上記と全く同じですが、そのビューにのみ適用されます。
- `groupBy`はプロパティとソート方向を指定します。各行の指定されたプロパティの値を使用して、行をグループに配置します。
- `summaries`はプロパティ名を名前付き要約にマッピングします。要約はすべての行にわたってプロパティの集計を実行します。
[[ビュー]]は、状態の維持や適切なレンダリングに必要な情報を格納するための追加データを追加できますが、プラグイン作者はコアBasesプラグインで既に使用されているキーを使用しないように注意する必要があります。例として、テーブルビューでは行数の制限や、行のソートに使用する列とその方向の選択にこれを使用できます。マップなどの異なるビュータイプでは、ノート内のどのプロパティが緯度と経度に対応し、どのプロパティがピンタイトルとして表示されるかをマッピングするためにこれを使用できます。
将来的には、APIによりビューがこれらの値を読み書きできるようになり、ビューが独自の設定インターフェースを構築できるようになります。
## プロパティ
ベースで使用されるプロパティには3種類あります:
1. **ノートプロパティ**、Markdownファイルのフロントマターに格納されます。
2. **ファイルプロパティ**、すべてのファイルタイプでアクセス可能です。
3. **数式プロパティ**、`.base`ファイル自体で定義されます(上記参照)。
### ノートプロパティ
[[プロパティ|ノートプロパティ]]はMarkdownファイルでのみ利用可能で、各ノートのYAMLフロントマターに格納されます。これらのプロパティは`note.author`の形式、または短縮形として単に`author`でアクセスできます。
### ファイルプロパティ
ファイルプロパティは、現在テストまたは評価されているファイルを参照します。ファイルプロパティは、添付ファイルを含むすべての[[対応ファイル形式|ファイルタイプ]]で利用可能です。
例えば、フィルター`file.ext == "md"`はすべてのMarkdownファイルに対して真、それ以外は偽になります。
| プロパティ | 型 | 説明 |
| ------------- | ------ | ------------------------------------------------------------- |
| `file.backlinks` | List | バックリンクファイルのリスト。注意:このプロパティはパフォーマンスへの負荷が高いです。可能な場合は、ルックアップを逆にして`file.links`を使用してください。保管庫が変更されたときに結果が自動的に更新されません。 |
| `file.ctime` | Date | 作成日時 |
| `file.embeds` | List | ノート内のすべての埋め込みのリスト |
| `file.ext` | String | ファイル拡張子 |
| `file.file` | File | ファイルオブジェクト、特定の関数でのみ使用可能 |
| `file.folder` | String | ファイルフォルダのパス |
| `file.links` | List | フロントマターを含む、ノート内のすべての内部リンクのリスト |
| `file.mtime` | Date | 更新日時 |
| `file.name` | String | ファイル名 |
| `file.path` | String | ファイルのパス |
| `file.properties` | Object | ファイル上のすべてのプロパティ。注意:保管庫が変更されたときに結果が自動的に更新されません。 |
| `file.size` | Number | ファイルサイズ |
| `file.tags` | List | ファイルコンテンツとフロントマター内のすべてのタグのリスト |
### `this`でプロパティにアクセスする
`this`オブジェクトを使用してファイルプロパティにアクセスします。`this`が何を参照するかは、ベースが表示される場所によって異なります。
ベースがメインコンテンツエリアで開かれている場合、`this`はベースファイル自体のプロパティを指します。例えば、`this.file.folder`を使用すると、ベースが配置されているフォルダパスが返されます。
ベースが別のファイルに埋め込まれている場合、`this`は_埋め込み元_ファイル(ベースを含むノートまたはCanvas)のプロパティを指します。例えば、`this.file.name`を使用すると、ベースではなく埋め込み元ファイルの名前が返されます。
ベースがサイドバーにある場合、`this`はメインコンテンツエリアのアクティブなファイルを参照します。これにより、アクティブなファイルに基づくクエリを作成できます。例えば、`file.hasLink(this.file)`を使用してバックリンクペインを再現できます。
## 演算子
### 算術演算子
算術演算子は数値に対して算術を実行します。例えば、`radius * (2 * 3.14)`です。
| 演算子 | 説明 |
| -------- | ----------- |
| `+` | 加算 |
| `-` | 減算 |
| `*` | 乗算 |
| `/` | 除算 |
| `%` | 剰余 |
| `( )` | 括弧 |
### 日付の算術
日付は期間の加算・減算によって変更できます。期間の単位は複数の形式を受け入れます:
| 単位 | 期間 |
| ------------------------ | -------- |
| `y`, `year`, `years` | 年 |
| `M`, `month`, `months` | 月 |
| `d`, `day`, `days` | 日 |
| `w`, `week`, `weeks` | 週 |
| `h`, `hour`, `hours` | 時間 |
| `m`, `minute`, `minutes` | 分 |
| `s`, `second`, `seconds` | 秒 |
Dateオブジェクトを変更またはオフセットするには、`+`または`-`演算子と期間文字列を使用します。例えば、`date + "1M"`は日付に1ヶ月を加え、`date - "2h"`は日付から2時間を引きます。
グローバル[[関数|関数]]`today()`を使用して現在の日付を取得でき、`now()`を使用して現在の日時を取得できます。
- `now() + "1 day"`は実行時から正確に24時間後の日時を返します。
- `file.mtime > now() - "1 week"`はファイルが過去1週間以内に変更された場合に`true`を返します。
- `date("2024-12-01") + "1M" + "4h" + "3m"`は`2025-01-01 04:03:00`を表すDateオブジェクトを返します。
- 2つの日付を減算すると、2つの間のミリ秒の差が得られます。例えば、`now() - file.ctime`です。
- 時刻付きDateの日付部分を取得するには、`datetime.date()`を使用します。
- Dateオブジェクトをフォーマットするには、`format()`関数を使用します。例えば`datetime.format("YYYY-MM-DD")`です。
### 比較演算子
比較演算子は数値やDateオブジェクトの比較に使用できます。等値と不等値は数値や日付だけでなく、あらゆる種類の値に使用できます。
| 演算子 | 説明 |
| -------- | ------------------------ |
| `==` | 等しい |
| `!=` | 等しくない |
| `>` | より大きい |
| `<` | より小さい |
| `>=` | 以上 |
| `<=` | 以下 |
### ブール演算子
ブール演算子は論理値の結合や反転に使用でき、真または偽の値を返します。
| 演算子 | 説明 |
| -------- | ----------- |
| `!` | 論理否定 |
| `&&` | 論理積 |
| \|\| | 論理和 |
## 関数
数式や[[ビュー|フィルター]]で使用できる[[関数|関数の一覧]]を参照してください。
## 型
ベースには型システムがあり、数式やフィルターがプロパティに関数を適用するために使用されます。
### 文字列、数値、ブール値
文字列、数値、ブール値は「プリミティブ」な値であり、作成するために関数を必要としません。
- 文字列はシングルクォートまたはダブルクォートで囲みます。例えば`"message"`です。
- 数値は数字で記述し、明確さのためにオプションで括弧で囲むことができます。例えば`1`や`(2.5)`です。
- ブール値は引用符なしで`true`または`false`と記述します。
### 日付と期間
日付は、作成に使用された関数や[[プロパティ|プロパティ]]に割り当てられた型に応じて、特定の日付または日時を表します。
- 日付を構築するには、`date`関数を使用します。例えば`date("2025-01-01 12:00:00")`です。
- 日付を変更するには、期間を加算または減算します。例えば`now() + "1 hour"`や`today() + "7d"`です。
- 比較演算子(例:`>`や`<`)や算術演算子を使用して日付を比較します(例えば、`(now() + "1d") - now()`は`86400000`ミリ秒を返します)。
- 日付の一部を抽出するには、利用可能なフィールド(`now().hour`)や便利な関数(`now.time()`)を使用します。
- 日付オブジェクトでは他にも多くの[[関数|フィールドと関数]]が利用可能です。
### オブジェクトとリスト
- `list()`関数を使用して単一要素をリストに変換します。これは、リストと単一の値が混在する可能性があるプロパティに特に便利です。
- 角括弧と0ベースのインデックスを使用してリスト要素にアクセスします。例えば、`property[0]`はリストの最初の要素を返します。
- 角括弧と要素名、またはドット記法を使用してオブジェクト要素にアクセスします。例えば、`property.subprop`や`property["subprop"]`です。
### ファイルとリンク
[[ノートをリンクする|ウィキリンク]]は[[プロパティ|フロントマタープロパティ]]で自動的にLinkオブジェクトとして認識されます。リンクは[[ビュー|ビュー]]でクリック可能なリンクとしてレンダリングされます。
- リンクを構築するには、グローバルな`link`[[関数|関数]]を使用します。例えば`link("filename")`や`link("https://obsidian.md")`です。
- 任意の文字列からリンクを作成できます。例えば`link(file.ctime.date().toString())`です。
- 表示テキストを設定するには、オプションの文字列またはアイコンを2番目のパラメータとして渡します。例えば`link("filename", "display")`や`link("filename", icon("plus"))`です。
Fileオブジェクトは、オプションの表示テキストを指定して`file.asLink()`を使用してリンクに変換できます。
リンクは`==`と`!=`で比較できます。同じファイルを指している場合、またはファイルが検索時に存在しない場合はリンクテキストが同一である場合に等価です。
リンクは`file`や`this`などのファイルと比較できます。リンクがファイルに解決される場合に等価になります。例えば`author == this`です。
リンクはリストの包含チェックでも使用できます。例えば`authors.contains(this)`です。