钥匙要点
-
由于查询和性能影响的复杂性,使用常见的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具有以前的_post关系。
>如果您现在打开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中文网其他相关文章!

在PHP中,可以使用session_status()或session_id()来检查会话是否已启动。1)使用session_status()函数,如果返回PHP_SESSION_ACTIVE,则会话已启动。2)使用session_id()函数,如果返回非空字符串,则会话已启动。这两种方法都能有效地检查会话状态,选择使用哪种方法取决于PHP版本和个人偏好。

sessionsarevitalinwebapplications,尤其是在commercePlatform之前。

在PHP中管理并发会话访问可以通过以下方法:1.使用数据库存储会话数据,2.采用Redis或Memcached,3.实施会话锁定策略。这些方法有助于确保数据一致性和提高并发性能。

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1
功能强大的PHP集成开发环境