当サイトではアフィリエイトプログラムを利用して商品を紹介しています。掲載リンクからご購入いただいた場合、当サイトに報酬が発生することがあります。

NotionのリレーションはAIに渡すと意味が消えます|列を1つ足すだけで直ります

白い紙に整然と並ぶ、同じ形の印の羅列。NotionのリレーションがIDだけで返ることを表した記事のアイキャッチ

Notionのデータを取り出して、AIに渡す。そのとき、1つの列だけが意味を失います。

取引先の欄に、会社名ではなく意味のない文字の羅列が入っている。そういう状態で渡していることがあります。

16種類の列を持つデータベースを作って、型ごとに確かめました。

16種類の列のうち、1つだけ意味が消えます

結論から書きます。

リレーションだけが、名前を返しません

ほかのデータベースとつなぐ列。これを取り出すと、つないだ相手のIDだけが返ってきます。

返ってくるのは、こういう形です。

取引先: 3e836319-0548-81b3-a465-f6a6060389ef

会社名はどこにもありません。これをそのままAIに渡しても、何も伝わりません。

気づきにくい形で壊れます

ここが厄介です。データとしては、ちゃんと値が入っています。空欄でもエラーでもありません。

取り出した側から見ると、取引先の欄に何かが入っている。形式としては正常です。

ところが、その中身に意味がない。渡した先で「取引先が分かりません」とは返ってきません。あるものとして扱われます。

どういう答えが返るか

取引先が分からないまま答えると、どうなるか。

聞いたこと 起きること
取引先ごとに集計してほしい IDごとに集計される
甲社の案件を教えてほしい 甲社という文字がないので見つからない
取引先の傾向を分析してほしい 分析はされるが、どこの話か分からない

いちばん困るのが3つ目です。それらしい答えは返ってきます。ただ、その中の会社名がIDのままなので、読んでも判断に使えません。

集計そのものは正しいかもしれません。正しいのに使えない、という形の失敗になります。

ほかの列は、ちゃんと名前が入っています

比べてみると、リレーションだけが例外だと分かります。

15種類は、そのまま読めました

列の型 返ってくるもの
タイトル 文字がそのまま
数値 数がそのまま
セレクト 選んだ名前が入っている
ステータス 選んだ名前が入っている
マルチセレクト 選んだ名前が全部入っている
日付 日付がそのまま
チェックボックス はい・いいえ
URL そのまま
メール そのまま
電話番号 そのまま
担当者 人の名前が入っている
作成者 人の名前が入っている
作成日時 日時がそのまま
数式 計算した結果が入っている
ロールアップ 集計した結果が入っている
リレーション IDだけ

上の15種類は、そのまま読めます。読めないのは、いちばん下のリレーションだけです。16種類のうち1つ、ということになります。

「名前を持っているか」で分かれます

セレクトもステータスも、選択肢の名前を持っています。担当者も、人の名前を持っています。

リレーションだけが、名前を持っていません。

これは仕組みとして自然でもあります。つないだ相手は別のページなので、名前はそちらにあります。ただ、渡す側からすると「1つだけ違う」という事実が重要です。

つまり、気にするのは1列だけです

逆に言えば、ほかの列は何も考えずに渡せます。名前を引きに行く処理が要るのは、リレーションだけです。

データベースにリレーションが無いなら、この記事の話は関係ありません。そのまま渡して大丈夫です。

自分のデータベースで、すぐ確かめられます

渡しているデータを一度そのまま眺めてみてください。36文字くらいの、英数字とハイフンが混ざった文字列を探します。

それが見つかったら、そこがリレーションです。その列の中身は、渡した先には伝わっていません。

見つかったもの 意味
会社名、担当者名、状態の名前 そのまま伝わっている
英数字とハイフンの長い文字列 伝わっていない

数えるより、目で見たほうが早いです。

しかも、25件で黙って切れます

もう1つ、リレーション特有の問題がありました。

30件つないで、25件しか返りません

1つの行に30社をつないで、取り出してみました。

取り出し方 返った件数
データベースの中身を取り出す 25件
その列だけを名指しで取り出す 30件(全部)

ふつうの取り出し方では、26件目から先が落ちます。

「まだある」は付きます

救いは、「まだある」という印が付いてくることです。これを見ていれば、切れたことは分かります。

ただ、1回に100件までしか返らない話と同じで、印を見ていなければ気づけません。

行の件数のほうは100件で切れますが、リレーションはもっと手前の25件で切れます。桁が違うので、先に当たるのはこちらです。

その列だけを取り出す方法があります

全部欲しいときは、その列だけを名指しで取り出す方法があります。今回は1回で30件すべて返りました。

ただし、行ごと、列ごとに呼ぶことになります。100行あれば100回です。次の話につながります。

1件ずつ引くと、25回かかります

では、IDから名前を引けばいいのではないか。そう考えます。

実際にやると、こうなりました

25件のリレーションについて、IDからページを1つずつ引いて名前を取り出しました。

結果
呼んだ回数 25回
かかった時間 9.3秒

1行ぶんで、これです。

読むのは速いはずなのに、なぜ時間がかかるのか。1回の呼び出しで1件しか取れないからです。まとめて取る方法がありません。

データベースの中身なら、1回で100件まとめて取れます。ところがページを名指しで取るときは、1回に1件です。

行が増えると、掛け算になります

行数 1行に5件つないでいると
10行 50回
100行 500回
1,000行 5,000回

本体を読むのは数回で済むのに、名前を引くために数百回。ここで時間のほとんどを使うことになります。

時間で見ると、こうなります。1件あたり0.37秒として計算した目安です。

行数 名前を引く時間の目安
10行 約20秒
100行 約3分
1,000行 約30分

毎日動かす処理なら、この時間が毎日かかります。本体の取得は数秒で終わっているのに、です。

同じ相手を何度も引きます

さらに無駄があります。取引先は、複数の案件から同じ会社がつながっているはずです。

行ごとに素直に引くと、同じ会社を何度も引きます。一度引いた分を覚えておけば減らせますが、そこまで作り込むことになります。

やり方 100行・取引先50社の場合
素直に1件ずつ引く 500回(同じ会社を何度も)
一度引いた分を覚えておく 50回
次に出てくる方法 0回

真ん中でも十分に速くなります。ただ、覚えておく仕組みを自分で作ることになります。次に書く方法なら、それも要りません。

列を1つ足すだけで解決します

もっと簡単な方法がありました。

ロールアップで、相手の名前を持ってこられます

ロールアップは、つないだ相手の列を集計する仕組みです。件数を数えたり、合計を出したりするものだと思われがちです。

ところが、集計せずに中身をそのまま持ってくる指定がありました。

取引先のリレーションに対して、相手の「会社名」をそのまま持ってくる列を1つ足します。すると、取り出したときに会社名が入って返ってきます。

追加の呼び出しが、0回になります

方法 追加の呼び出し 取れる件数
IDから1件ずつ引く 25回・9.3秒 25件
ロールアップを1列足す 0回 30件すべて

呼び出しが要らないうえに、25件の制限も受けませんでした。30件つないだものが、30件とも返っています。

ロールアップの指定は24種類ありました

ついでに、ロールアップで何ができるのかも数えました。24種類です。

ほとんどが数を数えるもの、合計や平均を出すもの、最も早い日付を出すものです。中身をそのまま持ってくるのは2種類だけでした。

ひとつは全部そのまま。もうひとつは重複を省いたものです。今回使うのは前者になります。

できること 種類の数
数を数える(件数、空欄の数、割合など) 10種類ほど
計算する(合計、平均、最大、最小など) 6種類ほど
日付を扱う(最も早い、最も遅い、期間) 3種類
チェックの数を数える 4種類
中身をそのまま持ってくる 2種類

ほとんどが集計用です。中身を運ぶ用途は、あまり知られていない使い方だと思います。

ちなみに、この一覧は存在しない指定をわざと送ると全部返ってきます。自分の環境で何ができるかを調べるときに使えます。

図にすると、こういう違いです

16種類の列のうち、意味が消えるのは1つだけ 15種類 選んだ名前・人の名前・計算結果が入っている リレーションだけ IDだけ。しかも25件で切れる 名前を手に入れる2つの方法 IDから1件ずつ引く 25件で25回・9.3秒 行数ぶん掛け算になる ロールアップを1列足す 追加の呼び出し 0回・30件すべて 25件の制限も受けない ただし、そのままでは文字数が6倍になる IDだけ 1,266文字 → ロールアップ 7,749文字 → 名前だけに絞ると 236文字。 ※ ロールアップで取ってから、名前だけに絞るまでがセットです。
30社をつないだ行を、取り出し方を変えて測った結果です。

ただし、絞るまでがセットです

いいことばかりではありません。

そのままだと、6倍に膨らみます

同じ30件について、文字数を数えました。

中身 文字数
IDだけ(元の状態) 1,266
ロールアップで取ったもの 7,749
名前だけに絞ったもの 236

意味は通るようになりましたが、文字数は6倍になりました。

理由は、装飾の情報です

ロールアップで持ってくるのは、相手の列の中身そのものです。文字の列なので、太字かどうかといった装飾の情報が一緒に付いてきます。

会社名が30件なら、その装飾の情報も30件分です。

名前だけ拾えば、元より小さくなります

ここから名前だけを拾い直すと、236文字になりました。IDだけだったときの1,266文字より小さいです。

IDは1つ36文字あります。会社名は数文字です。意味が通るようになって、しかも小さくなりました。

手順にすると、3つです

順番 やること
1 リレーションのある列に、相手の名前を持ってくるロールアップを足す
2 いつもどおり取り出す(追加の呼び出しは無し)
3 名前だけを拾い直してから渡す

1は画面からでもできます。一度足せば、あとはずっと使えます。

新しく仕組みを作る必要はありません。データベース側を1回直すだけです。取り出す処理は、そのままで構いません。

すでに動いている処理がある場合も、列を足すだけなら壊れません。返ってくる項目が1つ増えるだけです。

渡す前と、渡したあとで比べてください

やったあとに確かめるのも簡単です。

確かめること 見方
IDが残っていないか 長い英数字の文字列を探す
件数が合っているか 画面で見える数と比べる
文字数が減っているか 渡す前に数えておく

2つ目は、25件を超えている行で確かめてください。少ない行だけ見ていると、切れていることに気づけません。

よくある質問(FAQ)

リレーションのIDから、名前を引く以外に方法はありませんか。

ロールアップを1列足すのがいちばん簡単でした。追加の呼び出しが要らず、25件の制限も受けません。画面から1回足すだけです。

25件を超えるかどうかは、どう判断しますか。

取り出したときに「まだある」という印が付きます。それを見てください。ロールアップを足しておけば、そもそも切れませんでした。

ロールアップを足すと、画面の見た目が変わりませんか。

列が1つ増えます。画面で見せたくない場合は、ビューで隠せます。外から取り出すときには、隠していても入ってきました。

双方向につないでいる場合はどうなりますか。

どちらの側から見てもIDだけが返ります。名前が欲しい側にロールアップを足してください。

名前だけに絞るのは、どうやりますか。

取り出したデータから、名前にあたる部分だけを拾い直します。難しい処理ではありません。今回は7,749文字が236文字になりました。

リレーションの相手が消されていたら、どうなりますか。

そこは確かめていません。運用でページを消すことがあるなら、消したあとに一度取り出して確かめてから本番に入れてください。

ロールアップを1列足してください

リレーションはIDしか返さず、25件で切れます。相手の名前を持ってくるロールアップを1列足せば、追加の呼び出しなしで全件そろいます。あとは名前だけに絞ってから渡してください。

Notionを使ってみる

上部へスクロール