ホームページ >バックエンド開発 >PHPチュートリアル >NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン

NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-18 09:50:13517ブラウズ

NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン

キーテイクアウト

    ソーシャルアプリケーションのユーザータイムラインの実装は、クエリの複雑さとパフォーマンスへの影響により、一般的なSQLまたはNOSQLデータベースで困難な場合があります。 Neo4Jのようなグラフデータベースは、これらの問題を排除できます グラフデータベースのユーザーフィードの一般的なモデリング手法は、リンクリストです。これにより、タイムラインを取得するためにタイムスタンプを必要とせずに、ユーザーの最新の投稿にすぐにアクセスできます。
  • チュートリアルでは、Silexに構築されたデモアプリケーションを拡張してユーザーフィードを効率的にモデル化する方法を示しています。特定のユーザーのフィードを表示するためのルートを作成し、NEO4Jデータベースからフィードを取得し、ユーザーノードとともにテンプレートに渡すことを伴います。
  • ユーザーのタイムラインを表示するには、フォローしているすべてのユーザーを取得し、各ユーザーからlast_post関係にクエリを拡張する必要があります。その後、投稿はユーザー間でそれらを注文する時間ごとにフィルタリングされます。
  • タイムラインに投稿を追加するには、投稿ノードの作成、last_post関係をユーザーから古い最新_postへの削除、最後のポストノードとユーザーの間に新しい関係を作成し、新しいものと古いものの間の以前の_post関係を作成することを伴います。最後の投稿ノード。
  • 最近遭遇するソーシャルアプリケーションは、タイムラインを特徴としており、一般的に行われる時間の順に、友人やフォロワーのステータスを示しています。このような機能の実装は、一般的なSQLまたはNOSQLデータベースではかつてないほど簡単でした。 クエリの複雑さ、友人/フォロワーの数とともにパフォーマンスへの影響が増加し、ソーシャルモデルを進化させるのが難しいことは、グラフデータベースが排除しているポイントです。 このチュートリアルでは、NEO4JとPHPに関するそれぞれ2つの紹介記事で使用されているデモアプリケーションをそれぞれ拡張します。
  • NEO4JとPHP

を使用してグラフデータベースを発見します

ソーシャルネットワーク機能をNEO4Jを使用してPHPアプリに追加する

アプリケーションはSilex上に構築されており、他のユーザーをフォローしているユーザーがいます。この記事全体の目標は、フォローしている人々の最後の2つの投稿を取得し、時間ごとに注文するために、フィードの機能を効率的にモデル化することです。

リンクリストと呼ばれる特定のモデリング手法と、cypherを使用したいくつかの高度なクエリを発見します。 この記事のソースコードは、独自のgithubリポジトリにあります。 グラフデータベースのタイムラインのモデリング
  • 他のデータベースモデリング手法に慣れている人は、各投稿をユーザーに関連付ける傾向があります。投稿にはタイムスタンプのプロパティがあり、投稿の順序はこのプロパティに対して行われます。

    ここに簡単な表現があります:
  • そのようなモデルは問題なく動作しますが、それにいくつかの欠点があります:
  • 各ユーザーについては、最後のユーザーを取得するために彼の投稿を時間ごとに注文する必要があります
  • 注文操作は、投稿の量と従うユーザーの量とともに直線的に成長します
  • データベースは注文の操作を実行するように強制します

グラフデータベースのパワーを活用します

グラフデータベース内のノードは、彼が持っている接続への参照を保持し、グラフトラバーサルの迅速なパフォーマンスを提供します。

ユーザーフィードの一般的なモデリング手法は、リンクリストと呼ばれます。アプリケーションでは、ユーザーノードには、ユーザーが作成した最後の投稿と

last_post

という名前の関係があります。この投稿には、前の投稿との以前のものとの関係との関係があります。 このモデルを使用すると、ユーザーの最新の投稿にすぐにアクセスできます。実際、タイムラインを取得するためにタイムスタンプがまったく必要ではありません(さまざまなユーザーに投稿を並べ替えるために、保持します)。 さらに重要なことに、ユーザーが時間内に行っていることは、グラフデータベースで自然な方法でモデル化されています。このデータがデータベースの外側にどのように生きているかに対応する方法でデータを保存できることは、分析、検索、およびデータの理解にとって大きな利点です。 初期セットアップ

はじめに記事に使用されているリポジトリをダウンロードし、例えばソーシャルタイムラインに名前を変更することをお勧めします:NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン

前の記事と同様に、GraphGenの助けを借りて生成されたダミーデータセットでデータベースをロードします。

実行中のデータベース(ローカルまたはリモート)が必要です。このリンクに移動し、[生成]をクリックしてから「データベースの入力」を行う必要があります。

NEO4J 2.2を使用する場合は、NEO4Jユーザー名とパスワードをGraphGen Populatorボックスに提供する必要があります。

これにより、ログイン、名、姓で50人のユーザーがインポートされます。各ユーザーには2つのブログ投稿があります。1つはユーザーとの関係があり、もう1つは他のフィードとの以前の_POST関係を持つ1つあります。

NEO4Jブラウザを開くと、ユーザーと投稿がどのようにモデル化されているかを確認できます。
<span>git clone git@github.com:sitepoint-editors/social-network
</span><span>mv social-network social-timeline
</span>
<span>cd social-timeline
</span><span>rm -rf .git
</span><span>composer install
</span>bower <span>install</span>

ユーザーフィードの表示

アプリケーションには、すでにコントローラーとテンプレートのセットがあります。 1人のユーザーをクリックして選択できれば、フォロワーとフォローする人の提案が表示されます。

ユーザーはルート

に供給します NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン最初に、特定のユーザーのフィードを表示するためのルートを追加します。コードのこの部分をWeb/index.phpファイルの最後に追加します

<span>git clone git@github.com:sitepoint-editors/social-network
</span><span>mv social-network social-timeline
</span>
<span>cd social-timeline
</span><span>rm -rf .git
</span><span>composer install
</span>bower <span>install</span>

ユーザーはコントローラーとCypher Query

をフィードします いくつかの説明:

<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts')
</span>    <span>->bind('user_post');</span>
最初にユーザーをログイン名で一致させます。

次に、ユーザーの最後のフィードを一致させ、以前の_feedに拡張します( *0..2関係の深さの使用は、Postノードコレクション内に最新_POSTノードを埋め込む効果があります)。 2.
  • コレクションで発見されたフィードを返します。
  • テンプレートにフィードを表示
  • ユーザープロファイルにリンクを追加してフィードにアクセスします。ユーザー情報ブロックの最後にこの行を追加するだけで、
>

ユーザーのタイムライン(投稿)を示すテンプレートを作成します。専用のHTML Divに表示するために、フィードコレクションを繰り返して見出しとループを設定します:

ユーザーを選択して
<span>public function showUserPosts(Application $application, Request $request)
</span>    <span>{
</span>        <span>$login = $request->get('user_login');
</span>        <span>$neo = $application['neo'];
</span>        <span>$query = 'MATCH (user:User) WHERE user.login = {login}
</span><span>        MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post)
</span><span>        RETURN user, collect(post) as posts';
</span>        <span>$params = ['login' => $login];
</span>        <span>$result = $neo->sendCypherQuery($query, $params)->getResult();
</span>
        <span>if (null === $result->get('user')) {
</span>            <span>$application->abort(404, 'The user $login was not found');
</span>        <span>}
</span>
        <span>$posts = $result->get('posts');
</span>
        <span>return $application['twig']->render('show_user_posts.html.twig', array(
</span>            <span>'user' => $result->getSingle('user'),
</span>            <span>'posts' => $posts,
</span>        <span>));
</span>    <span>}</span>
[ユーザーの投稿を表示]
<span><span><span><p</span>></span><span><span><a</span> href<span>="{{ path('user_post', {user_login: user.property('login') }) }}"</span>></span>Show posts<span><span></a</span>></span><span><span></p</span>></span></span>
タイムラインの表示

GraphGenを使用してサンプルデータセットをインポートした場合、各ユーザーは約40人の他のユーザーをフォローします。

ユーザーのタイムラインを表示するには、彼がフォローするすべてのユーザーを取得し、各ユーザーからlast_post関係にクエリを拡張する必要があります。

これらすべての投稿を取得したら、ユーザー間でそれらを注文するために時間ごとにフィルタリングする必要があります。 NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムラインユーザーのタイムラインルート

プロセスは前のプロセスと同じです。Index.phpにルートを追加し、コントローラーアクションを作成し、ユーザープロファイルテンプレートのタイムラインへのリンクを追加し、ユーザータイムラインテンプレートを作成します。

web/index.phpファイルへのルートを追加

コントローラーアクション:

クエリに関する説明:

最初にユーザーと一致します。

次に、このユーザー、彼がフォローしている他のユーザーと最後のフィードの間のパスを一致させます(ここで、Cypherがあなたが取得したいものについて本当に表現する方法を参照してください)。

タイムスタンプでフィードを注文します。
{% extends "layout.html.twig" %}

{% block content %}
    <span><span><span><h1</span>></span>Posts for {{ user.property('login') }}<span><span></h1</span>></span>
</span>
    {% for post in posts %}
        <span><span><span><div</span> class<span>="row"</span>></span>
</span>        <span><span><span><h4</span>></span>{{ post.properties.title }}<span><span></h4</span>></span>
</span>        <span><span><span><div</span>></span>{{ post.properties.body }}<span><span></div</span>></span>
</span>        <span><span><span></div</span>></span>
</span>        <span><span><span><hr</span>/></span>
</span>    {% endfor %}

{% endblock %}

著者とフィードを含むコレクションのフィードを返します。

<span>$app->get('/user_timeline/{user_login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUserTimeline')
</span>    <span>->bind('user_timeline');</span>
結果を20個のフィードに制限します。

    ユーザーフィードリンクの直後に、ユーザープロファイルテンプレートにリンクを追加します。
  • およびタイムラインテンプレートを作成します:
  • データベースに効率的な、あなたがフォローする人々の最後の20のフィードを示す非常にクールなタイムラインがあります。

    NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムライン

    タイムラインへの投稿の追加

    リンクリストに投稿を追加するために、cypherクエリはもう少しトリッキーなです。投稿ノードを作成し、last_post関係をユーザーから古い最新_postに削除し、最後の投稿ノードとユーザーの新しい関係を作成し、最後に新しい最後の投稿ノードと古い最後の投稿ノードの間の以前の_post関係を作成する必要があります。 >

    簡単ですね。行きましょう!

    いつものように、WebControllerアクションを指すフォームのPOSTルートを作成します。

    次に、ユーザーテンプレートに投稿のタイトルとテキストを挿入するための基本的なHTMLフォームを追加します:
    <span>git clone git@github.com:sitepoint-editors/social-network
    </span><span>mv social-network social-timeline
    </span>
    <span>cd social-timeline
    </span><span>rm -rf .git
    </span><span>composer install
    </span>bower <span>install</span>

    そして最後に、新しいポストアクションを作成します:
    <span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts')
    </span>    <span>->bind('user_post');</span>

    いくつかの説明:
    <span>public function showUserPosts(Application $application, Request $request)
    </span>    <span>{
    </span>        <span>$login = $request->get('user_login');
    </span>        <span>$neo = $application['neo'];
    </span>        <span>$query = 'MATCH (user:User) WHERE user.login = {login}
    </span><span>        MATCH (user)-[:LAST_POST]->(latest_post)-[PREVIOUS_POST*0..2]->(post)
    </span><span>        RETURN user, collect(post) as posts';
    </span>        <span>$params = ['login' => $login];
    </span>        <span>$result = $neo->sendCypherQuery($query, $params)->getResult();
    </span>
            <span>if (null === $result->get('user')) {
    </span>            <span>$application->abort(404, 'The user $login was not found');
    </span>        <span>}
    </span>
            <span>$posts = $result->get('posts');
    </span>
            <span>return $application['twig']->render('show_user_posts.html.twig', array(
    </span>            <span>'user' => $result->getSingle('user'),
    </span>            <span>'posts' => $posts,
    </span>        <span>));
    </span>    <span>}</span>

    最初にユーザーを一致させ、次に彼のLAST_POSTノードをオプションで一致させます。
      ユーザーと彼の最新の最後の投稿との関係を削除します。
    • 新しい投稿を作成します(実際、彼の実生活のタイムラインでの彼の最後の投稿です)。
    • ユーザーと彼の「新しい」最後の投稿との関係を作成します。
    • クエリを破り、ユーザー、最後の投稿、彼の古い最新_postsのコレクションを渡します。
    • 次に、コレクションを反復し、新しい最後の投稿と次の投稿との間に以前の関係を作成します。
    • ここでのトリッキーな部分は、OldLatestPostsコレクションには常に0または1の要素が含まれていることです。これはクエリに最適です。
    • 結論
    • この記事では、リンクリストと呼ばれるモデリング手法を発見し、ソーシャルアプリケーションでこれを実装する方法と、効率的な方法でノードと関係を取得する方法を学びました。また、SkipやLimit、Paginationに役立つような新しいCypher条項も学びました。
    • 現実世界のタイムラインはここで見たものよりもかなり複雑ですが、NEO4Jのようなグラフデータベースがこのタイプのアプリケーションに最適な選択であることは明らかです。 NEO4Jを使用したPHPアプリケーションの効率的なユーザータイムラインに関するよくある質問(FAQ) neo4jのタイムラインデータを視覚化するにはどうすればよいですか?

      neo4jのタイムラインデータを視覚化するには、クロノグラフなどのさまざまなツールを使用して実現できます。このツールを使用すると、インタラクティブでダイナミックで視覚的に魅力的なタイムラインを作成できます。ニーズに合わせてタイムラインをカスタマイズしたり、イベントを追加したり、他のイベントにリンクすることもできます。これにより、データの関係やパターンを理解しやすくなります。

      NEO4Jを使用してTwitterデータを分析するにはどうすればよいですか?

      NEO4Jを使用して、視覚的なタイムラインを作成してTwitterデータを分析できます。これには、Twitterからデータを抽出し、Neo4Jにインポートし、Cypherクエリを使用してデータを分析することが含まれます。視覚タイムラインは、特定のユーザーのアクティビティや特定のハッシュタグの拡散など、データのパターンと傾向を明らかにするのに役立ちます。 NEO4Jのタイムラインイベントは、ノードと関係として表すことができます。各イベントはノードであり、それらの間の関係は一連のイベントを表します。ノードと関係のプロパティを使用して、発生した時間やその期間など、イベントに関する追加情報を保存できます。幅広いPHPバージョン。ただし、最高のパフォーマンスとセキュリティのために、PHPの最新バージョンを使用することを常にお勧めします。現在サポートされているバージョンの詳細については、公式PHP Webサイトで確認できます。これは、Web開発のためのシンプルなスクリプト言語として始まりましたが、オブジェクト指向のプログラミング、機能プログラミングなどをサポートする本格的なプログラミング言語に成長しました。 PHPの各バージョンは、パフォーマンス、セキュリティ、および機能の改善をもたらします。いくつかの戦略。これらには、Cypherクエリの最適化、インデックスを使用してデータの取得をスピードアップし、データベース接続を効率的に管理することが含まれます。さらに、最適なパフォーマンスを得るには、常に最新バージョンのPHPとNEO4Jを使用する必要があります。

      NEO4Jを使用してPHPアプリケーションを保護するにはどうすればよいですか?これらには、安全なデータベース接続の使用、噴射攻撃を防ぐためのユーザー入力の消毒、適切なエラー処理の実装が含まれます。さらに、最新のセキュリティパッチの恩恵を受けるために、PHPとNEO4Jソフトウェアを常に最新の状態に保ちます。 NEO4Jを使用したPHPアプリケーションは、トライキャッチブロックを使用して実行できます。これにより、コードの実行中に発生する例外をキャッチし、適切に処理できます。また、エラーロギングを使用して、発生する問題を追跡することもできます。これには、NEO4Jのクラスタリング機能を使用して複数のサーバーにデータを配布し、データベーススキーマとパフォーマンスのクエリを最適化し、キャッシュを使用してデータベースの負荷を削減します。

      既存のPHPアプリケーションを移行してNEO4Jを使用するにはどうすればよいですか?

      既存のPHPアプリケーションを移行してNEO4Jを使用するには、いくつかのステップが含まれます。まず、データをグラフとしてモデル化し、NEO4Jにインポートする必要があります。次に、データベース操作にNEO4JのPHPドライバーを使用するためにアプリケーションコードを更新する必要があります。最後に、アプリケーションがNEO4Jで正しく機能するように徹底的にテストする必要があります。

以上がNEO4Jを使用したPHPアプリケーションの効率的なユーザータイムラインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。