使用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具有以前的_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</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)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。
