首頁 >後端開發 >php教程 >使用neo4j的PHP應用程序中有效的用戶時間表

使用neo4j的PHP應用程序中有效的用戶時間表

Joseph Gordon-Levitt
Joseph Gordon-Levitt原創
2025-02-18 09:50:13522瀏覽

使用neo4j的PHP應用程序中有效的用戶時間表

鑰匙要點

    由於查詢和性能影響的複雜性,使用常見的SQL或NOSQL數據庫實施用戶時間表可能會具有挑戰性。圖形數據庫,例如Neo4J,可以消除這些問題。
  • >
  • 圖形數據庫中用戶feed的通用建模技術是鏈接列表。這允許立即訪問用戶的最新帖子,而無需時間戳來檢索時間表。
  • >
  • >教程演示瞭如何擴展在Silex上構建的演示應用程序,以有效地對用戶進行建模。它涉及創建一條路由,以顯示特定用戶的提要,從Neo4J數據庫中獲取feed,並將它們與用戶節點一起傳遞到模板。
  • 要顯示一個用戶時間表,需要獲取他/她關注的所有用戶,並將查詢擴展到每個用戶的last_post關係。然後,通過時間過濾這些帖子,以在用戶之間訂購它們。
  • >
  • >在時間表中添加帖子涉及創建帖子節點,將last_post關係從用戶刪除到舊的最新_post,在最後一個帖子節點和用戶之間創建新的關係,並在新舊的和舊的舊舊之間創建上一個_post的關係最後一個帖子節點。
  • >當今您遇到的任何社交應用程序都具有時間表,通常以降時間的時間順序顯示朋友或關注者的狀態。對於常見的SQL或NOSQL數據庫,實現此類功能從來都不是一件容易的事。
查詢的複雜性,績效的影響隨著朋友/追隨者的數量而增加,而難以發展您的社交模型是圖形數據庫消除的觀點。

> 在本教程中,我們將分別擴展有關Neo4J和PHP的兩個介紹文章使用的演示應用程序:

>

>使用neo4j和php

發現圖形數據庫
  • >將社交網絡功能添加到使用Neo4J

    的PHP應用程序中
  • 該應用程序是在Silex上構建的,並具有其他用戶的用戶。本文中的目標是有效地對feed的功能進行建模,以便檢索您遵循的人的最後兩個帖子並按時間訂購。

    >

    >您會發現一種特定的建模技術,稱為鏈接列表和一些帶有Cypher的高級查詢。
本文的源代碼可以在其自己的github存儲庫中找到。

>

在圖數據庫中對時間軸建模

習慣其他數據庫建模技術的人傾向於將每個帖子與用戶聯繫起來。帖子將具有時間戳屬性,並且將對此屬性進行帖子的順序。 >

這是一個簡單的表示:

>

>這樣的模型會毫無問題地工作,但有些不利:>
  • 對於每個用戶,您需要按時間訂購他的帖子才能獲取最後一個
  • 訂單操作將隨著您關注的帖子和用戶的數量線性增長
  • >它迫使數據庫執行訂購的操作
利用圖數據庫的功能

圖數據庫中的一個節點包含對他所擁有的連接的引用,為圖形遍歷提供了快速的性能。

>用於用戶供稿的通用建模技術稱為鏈接列表。在我們的應用程序中,用戶節點將與用戶創建的最後一篇文章具有名為 last_post

的關係。這篇文章將與上一篇具有a

> prest_post的關係,該帖子在上一個上一篇文章等上也具有a preast_post等等。 >使用此模型,您可以立即訪問用戶的最新帖子。實際上,您甚至根本不需要時間戳來檢索其時間表(但是我們會保留它,以便對不同用戶進行分類)。

>更重要的是,用戶在圖形數據庫中以自然方式建模的用戶所做的事情。能夠以與該數據在數據庫之外的方式相對應的方式存儲數據是分析,查找和理解您的數據的真正好處。

使用neo4j的PHP應用程序中有效的用戶時間表初始設置

我建議您下載用於簡介文章的存儲庫,並將其重命名為社交台式,例如:

>與上一篇文章一樣,我們將在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瀏覽器,則可以查看用戶和帖子的建模:

使用neo4j的PHP應用程序中有效的用戶時間表

顯示用戶feed

該應用程序已經具有一組控制器和模板。您可以通過單擊一個用戶來選擇一個用戶,它將顯示他們的關注者和一些人的建議。

用戶饋送路線

使用neo4j的PHP應用程序中有效的用戶時間表首先,我們將添加一條路由以顯示特定用戶的提要。將此代碼的一部分添加到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關係。 使用neo4j的PHP應用程序中有效的用戶時間表

>當您獲得所有這些帖子時,您需要按時間過濾它們,以在用戶之間訂購它們。

用戶時間軸路由

該過程與上一個過程相同 - 我們將路由添加到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個供稿,這對於數據庫很有效。

    使用neo4j的PHP應用程序中有效的用戶時間表

    >在時間軸上添加帖子

    為了將帖子添加到鏈接列表中,Cypher查詢更為 tricky 。您需要創建帖子節點,將last_post關係從用戶刪除到舊的最新_ post,在最後一個帖子節點和用戶之間創建新的關係,然後在新的和舊的最後一個帖子節點之間創建上一個_ post的關係。 > 簡單,不是嗎?讓我們走!

    >像往常一樣,我們將為指向WebController操作的表單創建郵圖:

    接下來,我們將添加一個基本的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>

    >最後,我們創建了我們的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個元素,這是我們查詢的理想選擇。
    • >
    • 結論
    在本文中,我們發現了一種稱為鏈接列表的建模技術,學習瞭如何在社交應用程序中實現它以及如何以有效的方式檢索節點和關係。我們還學會了一些新的Cypher子句,例如Skip和Limit,可用於分頁。

    >現實世界的時間表比我們在這裡看到的要復雜得多,但我希望很明顯,像neo4j這樣的圖形數據庫確實是此類應用程序的最佳選擇。

    經常詢問的問題(常見問題解答)關於使用NEO4J

    在PHP應用中有效的用戶時間表 使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn