首页 >后端开发 >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具有以前的_post关系。

>

如果您现在打开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