ホームページ >バックエンド開発 >PHPチュートリアル >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>
<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts') </span> <span>->bind('user_post');</span>最初にユーザーをログイン名で一致させます。
次に、ユーザーの最後のフィードを一致させ、以前の_feedに拡張します( *0..2関係の深さの使用は、Postノードコレクション内に最新_POSTノードを埋め込む効果があります)。 2.
<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関係にクエリを拡張する必要があります。これらすべての投稿を取得したら、ユーザー間でそれらを注文するために時間ごとにフィルタリングする必要があります。
ユーザーのタイムラインルート
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個のフィードに制限します。
リンクリストに投稿を追加するために、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ノードをオプションで一致させます。
NEO4Jを使用して、視覚的なタイムラインを作成してTwitterデータを分析できます。これには、Twitterからデータを抽出し、Neo4Jにインポートし、Cypherクエリを使用してデータを分析することが含まれます。視覚タイムラインは、特定のユーザーのアクティビティや特定のハッシュタグの拡散など、データのパターンと傾向を明らかにするのに役立ちます。 NEO4Jのタイムラインイベントは、ノードと関係として表すことができます。各イベントはノードであり、それらの間の関係は一連のイベントを表します。ノードと関係のプロパティを使用して、発生した時間やその期間など、イベントに関する追加情報を保存できます。幅広いPHPバージョン。ただし、最高のパフォーマンスとセキュリティのために、PHPの最新バージョンを使用することを常にお勧めします。現在サポートされているバージョンの詳細については、公式PHP Webサイトで確認できます。これは、Web開発のためのシンプルなスクリプト言語として始まりましたが、オブジェクト指向のプログラミング、機能プログラミングなどをサポートする本格的なプログラミング言語に成長しました。 PHPの各バージョンは、パフォーマンス、セキュリティ、および機能の改善をもたらします。いくつかの戦略。これらには、Cypherクエリの最適化、インデックスを使用してデータの取得をスピードアップし、データベース接続を効率的に管理することが含まれます。さらに、最適なパフォーマンスを得るには、常に最新バージョンのPHPとNEO4Jを使用する必要があります。
既存のPHPアプリケーションを移行してNEO4Jを使用するには、いくつかのステップが含まれます。まず、データをグラフとしてモデル化し、NEO4Jにインポートする必要があります。次に、データベース操作にNEO4JのPHPドライバーを使用するためにアプリケーションコードを更新する必要があります。最後に、アプリケーションがNEO4Jで正しく機能するように徹底的にテストする必要があります。
以上がNEO4Jを使用したPHPアプリケーションの効率的なユーザータイムラインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。