使用neo4j的PHP應用程序中有效的用戶時間表
鑰匙要點
-
由於查詢和性能影響的複雜性,使用常見的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</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關係。
用戶時間軸路由
該過程與上一個過程相同 - 我們將路由添加到index.php,創建控制器操作,我們在用戶配置文件模板中的時間表中添加鏈接,並創建我們的用戶時間表模板。
>將路由添加到Web/index.php文件
控制器動作:
有關查詢的解釋:
>
首先,我們匹配我們的用戶。
然後,我們匹配此用戶,他關注的其他用戶和他們的最後一個feed之間的路徑(請參閱此處的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個供稿中。
-
在用戶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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
