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

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來源通過token防止CSRF並通過finfo_file檢測真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測類型決定擴(kuò)展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號和避免嵌套。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

在PHP中獲取字符串特定索引字符可用方括號或花括號,但推薦方括號;索引從0開始,超出範(fàn)圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

易於效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
