キーテイクアウト
-
ソーシャルアプリケーションのユーザータイムラインの実装は、クエリの複雑さとパフォーマンスへの影響により、一般的な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という名前の関係があります。この投稿には、前の投稿との以前のものとの関係との関係があります。 このモデルを使用すると、ユーザーの最新の投稿にすぐにアクセスできます。実際、タイムラインを取得するためにタイムスタンプがまったく必要ではありません(さまざまなユーザーに投稿を並べ替えるために、保持します)。 さらに重要なことに、ユーザーが時間内に行っていることは、グラフデータベースで自然な方法でモデル化されています。このデータがデータベースの外側にどのように生きているかに対応する方法でデータを保存できることは、分析、検索、およびデータの理解にとって大きな利点です。 初期セットアップ
はじめに記事に使用されているリポジトリをダウンロードし、例えばソーシャルタイムラインに名前を変更することをお勧めします:
前の記事と同様に、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人のユーザーをクリックして選択できれば、フォロワーとフォローする人の提案が表示されます。
ユーザーはルートに供給します
最初に、特定のユーザーのフィードを表示するためのルートを追加します。コードのこの部分を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>></p></span><span><span><a> href<span>="{{ path('user_post', {user_login: user.property('login') }) }}"</span>></a></span>Show posts<span><span></span>></span><span><span></span>></span></span></span></span>タイムラインの表示
GraphGenを使用してサンプルデータセットをインポートした場合、各ユーザーは約40人の他のユーザーをフォローします。
ユーザーのタイムラインを表示するには、彼がフォローするすべてのユーザーを取得し、各ユーザーからlast_post関係にクエリを拡張する必要があります。これらすべての投稿を取得したら、ユーザー間でそれらを注文するために時間ごとにフィルタリングする必要があります。
ユーザーのタイムラインルート
プロセスは前のプロセスと同じです。Index.phpにルートを追加し、コントローラーアクションを作成し、ユーザープロファイルテンプレートのタイムラインへのリンクを追加し、ユーザータイムラインテンプレートを作成します。
web/index.phpファイルへのルートを追加
コントローラーアクション:
クエリに関する説明:
最初にユーザーと一致します。
次に、このユーザー、彼がフォローしている他のユーザーと最後のフィードの間のパスを一致させます(ここで、Cypherがあなたが取得したいものについて本当に表現する方法を参照してください)。
タイムスタンプでフィードを注文します。{% extends "layout.html.twig" %} {% block content %} <span><span><span><h1 id="gt">></h1></span>Posts for {{ user.property('login') }}<span><span></span>></span> </span> {% for post in posts %} <span><span><span><div> class<span>="row"</span>> <span><span><span><h4 id="gt">></h4></span>{{ post.properties.title }}<span><span></span>></span> </span> <span><span><span><div>>{{ post.properties.body }}<span><span></span></span> </div></span>></span> </span> <span><span><span></span></span></span></span> </div></span>></span> </span> <span><span><span><hr>/></span> </span> {% endfor %} {% endblock %}</span></span>
著者とフィードを含むコレクションのフィードを返します。
<span>$app->get('/user_timeline/{user_login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUserTimeline') </span> <span>->bind('user_timeline');</span>結果を20個のフィードに制限します。
- ユーザーフィードリンクの直後に、ユーザープロファイルテンプレートにリンクを追加します。
- およびタイムラインテンプレートを作成します:
- データベースに効率的な、あなたがフォローする人々の最後の20のフィードを示す非常にクールなタイムラインがあります。
タイムラインへの投稿の追加
リンクリストに投稿を追加するために、cypherクエリはもう少しトリッキーなです。投稿ノードを作成し、last_post関係をユーザーから古い最新_postに削除し、最後の投稿ノードとユーザーの新しい関係を作成し、最後に新しい最後の投稿ノードと古い最後の投稿ノードの間の以前の_post関係を作成する必要があります。 >
簡単ですね。行きましょう!<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>
- ユーザーと彼の最新の最後の投稿との関係を削除します。
- 新しい投稿を作成します(実際、彼の実生活のタイムラインでの彼の最後の投稿です)。 ユーザーと彼の「新しい」最後の投稿との関係を作成します。
- クエリを破り、ユーザー、最後の投稿、彼の古い最新_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 サイトの他の関連記事を参照してください。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

Laravelのサービスコンテナとサービスプロバイダーは、そのアーキテクチャの基本です。 この記事では、サービスコンテナ、詳細サービスプロバイダーの作成、登録、および実用的な使用法を例で説明します。 Oveから始めます

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック



