Ken WagatsumaSRE at Neo4j

Blog: Post "Level" Introduced

★ introductory

October 08, 2021

本ブログに、記事ごとの難易度を示す Level の概念を追加しました。

課題

最近、同僚や友人に Graph Database について説明する機会が増えてきました。

Graph Database に対する理解度は様々で、「実は以前研究で使ったことがある」という方もいれば、「Graph Database について初めて聞いた」という方もいます。「前の会社でプロダクションで使ったことがある」という方もいました。

日本での Graph Database の知見を広げるために本ブログを始めたわけですが、読者の方の最初の理解度は上記のように様々です。

今までは、新しい読者の方がブログに来た時に、自分が興味のある記事を探しやすいようにタグ一覧関連タグの機能を実装してきました。

ただし、全く初めての人が Graph Database について知りたいとなった場合、タグだけでは不十分です。タグに書かれたキーワードがそもそも初見のため、特に入門者の方にとっても、より良い取っ掛かりとなる読者体験が必要でした。

解決策

Level は、introductory / intermediate / advanced の三段階に分かれています。ブログ一覧ページなどで、記事ごとにレベルを表示させています。

Post Level Introduced Screenshot

各 Level ごとにページを用意してあり、Level 別ページではそのレベリングがされた記事一覧を閲覧できます。

例えば、「新しく Graph Database について学んでみたい」という方には、introductory ページを紹介することができます。

実装

各 Post に一対一の関係で Level ノードを追加しています。

執筆時点で、ブログ周りのスキーマは以下のようになっています。

Post Level Schema

例えば、本記事のメタデータを追加する Cypher は以下の通りです。

MERGE (p:Post {slug: '/2021-10-08-blog-post-level-introduced/', date: '2021-10-08', title: 'Blog: Post "Level" Introduced'})
MERGE (level:Level {value: 'introductory'})
MERGE (p)-[:LEVELED_WITH]->(level);

例えば、「Level ごとの記事数」をテーブルで表示させる Cypher クエリは以下のようになります。

MATCH (l:Level)
WITH DISTINCT l as levels
UNWIND levels as l
MATCH (l)<-[:LEVELED_WITH]-(p:Post)
RETURN l.value, count(p)

最後に

以上、本ブログに実装した Level について紹介しました。

Recommended Posts

  1. ★★★ advanced
    blog-post-and-urls-relationship
    本ブログでは、全記事のメタデータを HTML ビルド時に解析し、Cypher クエリに変換した上で Neo4j Aura に保存しています。 今回、記事本文に含まれる外部サイトへのリンク数も解析対象に付与しました。 データモデリングの一例としてご紹介します。 課題 ブログの記事には、Wikipedia…
  2. ★★★ advanced
    blog-relevant-tags-internals-datamodeling-sketch
    つい先日、本ブログに、Relevant Tags の機能を実装しました。 例えば、#neo4j タグページの下部に、以下の UI が追加されていることに気づいた方もいらっしゃるかもしれません。 実は、このタグの関連性を計算するにあたって、Neo4j Aura を利用しています。 本ブログでは、Relevant Tags…