鑰匙要點
-
由於查詢和性能影響的複雜性,使用常見的SQL或NOSQL數據庫實施用戶時間表可能會具有挑戰性。圖形數據庫,例如Neo4J,可以消除這些問題。
- > 圖形數據庫中用戶feed的通用建模技術是鏈接列表。這允許立即訪問用戶的最新帖子,而無需時間戳來檢索時間表。
- > >教程演示瞭如何擴展在Silex上構建的演示應用程序,以有效地對用戶進行建模。它涉及創建一條路由,以顯示特定用戶的提要,從Neo4J數據庫中獲取feed,並將它們與用戶節點一起傳遞到模板。
- 要顯示一個用戶時間表,需要獲取他/她關注的所有用戶,並將查詢擴展到每個用戶的last_post關係。然後,通過時間過濾這些帖子,以在用戶之間訂購它們。 >
- >在時間表中添加帖子涉及創建帖子節點,將last_post關係從用戶刪除到舊的最新_post,在最後一個帖子節點和用戶之間創建新的關係,並在新舊的和舊的舊舊之間創建上一個_post的關係最後一個帖子節點。
- >當今您遇到的任何社交應用程序都具有時間表,通常以降時間的時間順序顯示朋友或關注者的狀態。對於常見的SQL或NOSQL數據庫,實現此類功能從來都不是一件容易的事。
>
在本教程中,我們將分別擴展有關Neo4J和PHP的兩個介紹文章使用的演示應用程序:
>
>使用neo4j和php發現圖形數據庫- >將社交網絡功能添加到使用Neo4J
- 該應用程序是在Silex上構建的,並具有其他用戶的用戶。本文中的目標是有效地對feed的功能進行建模,以便檢索您遵循的人的最後兩個帖子並按時間訂購。
>
>您會發現一種特定的建模技術,稱為鏈接列表和一些帶有Cypher的高級查詢。
>
在圖數據庫中對時間軸建模習慣其他數據庫建模技術的人傾向於將每個帖子與用戶聯繫起來。帖子將具有時間戳屬性,並且將對此屬性進行帖子的順序。
這是一個簡單的表示:
>>這樣的模型會毫無問題地工作,但有些不利:
- 對於每個用戶,您需要按時間訂購他的帖子才能獲取最後一個
- 訂單操作將隨著您關注的帖子和用戶的數量線性增長 >它迫使數據庫執行訂購的操作
圖數據庫中的一個節點包含對他所擁有的連接的引用,為圖形遍歷提供了快速的性能。
>用於用戶供稿的通用建模技術稱為鏈接列表。在我們的應用程序中,用戶節點將與用戶創建的最後一篇文章具有名為
> prest_post的關係,該帖子在上一個上一篇文章等上也具有a preast_post等等。 >使用此模型,您可以立即訪問用戶的最新帖子。實際上,您甚至根本不需要時間戳來檢索其時間表(但是我們會保留它,以便對不同用戶進行分類)。
>更重要的是,用戶在圖形數據庫中以自然方式建模的用戶所做的事情。能夠以與該數據在數據庫之外的方式相對應的方式存儲數據是分析,查找和理解您的數據的真正好處。
初始設置
我建議您下載用於簡介文章的存儲庫,並將其重命名為社交台式,例如:
>與上一篇文章一樣,我們將在GraphGen的幫助下加載數據庫。
。
>您需要擁有一個正在運行的數據庫(本地或遠程),轉到此鏈接,單擊“生成”,然後在“填充數據庫”上。如果使用Neo4J 2.2,則需要在GraphGen Populator框中提供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>
>這將以登錄名,名字和姓氏為例導入50個用戶。每個用戶將有兩個博客文章,一篇文章與用戶有last_post的關係,另一個與其他feed具有以前的關係。
>如果您現在打開Neo4J瀏覽器,則可以查看用戶和帖子的建模:
顯示用戶feed
該應用程序已經具有一組控制器和模板。您可以通過單擊一個用戶來選擇一個用戶,它將顯示他們的關注者和一些人的建議。
用戶饋送路線
首先,我們將添加一條路由以顯示特定用戶的提要。將此代碼的一部分添加到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查詢
我們將在src/controller/webcontroller.php文件中將路由映射到操作。 在此操作中,我們將從NEO4J數據庫中獲取給定用戶的feed,並將它們與用戶節點一起傳遞到模板。
一些解釋:
<span>$app->get('/users/{user_login}/posts', 'Ikwattro\SocialNetwork\Controller\WebController::showUserPosts') </span> <span>->bind('user_post');</span>
我們首先以用戶的登錄名與用戶匹配。
然後,我們將用戶的最後一個供稿匹配,然後擴展到上一個_feed(使用*0..2關係深度的使用將有效嵌入最新的_post節點在郵政節點集合中),我們將最大深度限制為2.- 我們返回在集合中找到的供稿。
- >在模板中顯示feed
- >我們將在用戶配置文件中首先添加鏈接以訪問其feed,只需在用戶信息塊的末尾添加此行:
>現在,我們將創建模板顯示用戶時間軸(帖子)。我們設置了一個標題和一個循環,以迭代我們的供稿集合,以在專用的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文件
控制器動作:
有關查詢的解釋:
>
首先,我們匹配我們的用戶。
然後,我們匹配此用戶,他關注的其他用戶和他們的最後一個feed之間的路徑(請參閱此處的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個供稿中。
-
在用戶feed鏈接之後,
- 添加到用戶配置文件模板的鏈接:
> - 並創建時間表模板:
> - >我們現在有一個很酷的時間表,顯示了您關注的人的最後20個供稿,這對於數據庫很有效。
>在時間軸上添加帖子
為了將帖子添加到鏈接列表中,Cypher查詢更為
tricky 。您需要創建帖子節點,將last_post關係從用戶刪除到舊的最新_ post,在最後一個帖子節點和用戶之間創建新的關係,然後在新的和舊的最後一個帖子節點之間創建上一個_ post的關係。 > 簡單,不是嗎?讓我們走! >像往常一樣,我們將為指向WebController操作的表單創建郵圖:
<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>
>最後,我們創建了我們的newPost動作:
<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節點。
>我們刪除用戶與他最近的最後一篇文章之間的關係。 - >
- 我們創建了我們的新帖子(實際上是他在現實生活中的最後一篇文章)。 我們創建用戶與他的“新”上一篇文章之間的關係。
- 我們打破查詢並傳遞用戶,最後一篇文章和他舊的lestest_posts的集合。 然後,我們在集合上迭代並在新的最後一篇文章和下一篇文章之間創建上一個_post的關係。
- >
- 在這裡棘手的部分是,OldlatestPosts Collection將始終包含0或1個元素,這是我們查詢的理想選擇。 >
- 結論
>現實世界的時間表比我們在這裡看到的要復雜得多,但我希望很明顯,像neo4j這樣的圖形數據庫確實是此類應用程序的最佳選擇。
經常詢問的問題(常見問題解答)關於使用NEO4J在PHP應用中有效的用戶時間表
>如何使用各種工具(例如Konograph)在neo4j?
中可視化時間表數據。該工具使您可以創建交互式,動態和視覺吸引力的時間表。您可以自定義時間表以適應您的需求,添加活動,甚至將其鏈接到其他事件。這使得了解數據中的關係和模式變得更加容易。
>>如何使用neo4j分析Twitter數據?
neo4j可以通過創建視覺時間表來分析Twitter數據。這涉及從Twitter提取數據,將其導入Neo4J,然後使用Cypher查詢來分析數據。視覺時間表可以幫助揭示數據中的模式和趨勢,例如特定用戶的活動或特定主題標籤的傳播。>
>如何表示Neo4j中的時間表事件? NEO4J中的時間軸事件可以表示為節點和關係。每個事件都是一個節點,它們之間的關係代表事件的序列。您可以在節點和關係上使用屬性來存儲有關事件的其他信息,例如它們發生的時間或持續時間。>
> neo4j支持哪些版本的PHP。廣泛的PHP版本。但是,始終建議使用最新的穩定版本的PHP來獲得最佳性能和安全性。您可以查看官方PHP網站以獲取有關當前支持版本的信息。多年來,PHP是如何發展的? PHP自成立以來就已經顯著發展。它最初是一種簡單的腳本語言,用於Web開發,但已發展成為一種完整的編程語言,並支持面向對象的編程,功能編程等。每種新版本的PHP都會改善性能,安全性和功能。 >如何使用neo4j??幾種策略。這些包括優化您的Cypher查詢,使用索引來加快數據檢索並有效地管理數據庫連接。此外,您應該始終將最新版本的PHP和Neo4J用於最佳性能。 >如何使用neo4j? >
>使用NEO4J確保PHP應用程序涉及多個步驟。其中包括使用安全的數據庫連接,對用戶輸入進行消毒以防止注射攻擊以及實施適當的錯誤處理。此外,您應始終保持PHP和NEO4J軟件的最新狀態,以從最新的安全補丁中受益。 >我如何使用Neo4j?在我的PHP應用程序中處理錯誤使用NEO4J的PHP應用程序可以使用Try-Catch塊進行。這使您可以捕獲執行代碼期間發生的任何例外,並適當處理它們。您還可以使用錯誤記錄來跟踪發生的任何問題。 >如何通過Neo4J? 縮放我的PHP應用程序,可以通過各種策略來實現使用neo4j的PHP應用程序。其中包括使用Neo4J的群集功能在多個服務器上分配您的數據,優化數據庫模式和查詢以進行性能,並使用緩存來減少數據庫負載。 >如何遷移我現有的PHP應用程序以使用neo4j?
>遷移現有的PHP應用程序使用NEO4J涉及多個步驟。首先,您需要將數據建模為圖形並將其導入Neo4J。然後,您需要更新應用程序代碼,以將NEO4J的PHP驅動程序用於數據庫操作。最後,您需要徹底測試您的應用程序,以確保其與Neo4J合作正常。
以上是使用neo4j的PHP應用程序中有效的用戶時間表的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

這是有關用Laravel後端構建React應用程序的系列的第二個也是最後一部分。在該系列的第一部分中,我們使用Laravel為基本的產品上市應用程序創建了一個RESTFUL API。在本教程中,我們將成為開發人員

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

在本文中,我們將在Laravel Web框架中探索通知系統。 Laravel中的通知系統使您可以通過不同渠道向用戶發送通知。今天,我們將討論您如何發送通知OV

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。