钥匙要点
-
由于查询和性能影响的复杂性,使用常见的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中文网其他相关文章!

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

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' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

Laravel的服务容器和服务提供商是其架构的基础。 本文探讨了服务容器,详细信息服务提供商创建,注册,并通过示例演示了实际用法。 我们将从OVE开始


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

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

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。