使用neo4j添加社交网络功能
钥匙要点
>利用Silex,Twig,Bootstrap和Neoclient为使用NEO4J集成到PHP应用程序中提供了强大的基础。 Silex框架内Neo4Jclient的配置允许与Neo4J图形数据库无缝交互,从而实现了有效的数据检索和操作。
- >用户配置文件的实现以及查看用户遵循的人的能力演示了图数据库查询在管理社会关系中的实际应用。
- 添加用户关系功能,例如以下或取消关注其他用户,在PHP应用程序中处理复杂的社交网络操作时,展示了Neo4J的动态功能。
- 社交网络功能的扩展,包括根据现有关系遵循的建议,说明了图数据库提供有意义的数据见解和增强用户参与度的力量。
- >引导程序
- >我将使用silex,twig,bootstrap和neoclient来构建应用程序。
- > >为应用程序创建目录。我叫我的spsocial。
>将这些行添加到您的composer.json并运行作曲家安装以安装依赖项:
您可以下载并安装Bootstrap到您项目的Web/Assets文件夹中。
>
>您也可以在此处找到Bootstrap演示应用程序:https://github.com/sitepoint-editors/social-network设置Silex应用程序
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
我们需要配置Silex并声明Neo4Jclient,因此它将在Silex应用程序中使用。在您的项目的Web/文件夹中创建一个index.php文件:
>> twig配置为将其模板文件放置在SRC/Views文件夹中。
指向 /已注册并配置为使用WebController的家庭路由我们将在以后创建。
应用结构应该看起来像这样:
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>
请注意,我在这里使用Bower安装bootstrap,但取决于您要使用的内容。
我将以navault bootstrap为主题,上面有一个纳维栏:
到目前为止,我们在应用程序中有NEO4J可用,我们的基本模板是创建的,我们希望在主页上列出所有用户。
我们可以通过两个步骤来实现这一目标:
- 创建我们的家庭控制器操作,并从Neo4J 中检索用户
- >将用户列表传递到模板并列出 >
控制器操作
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
>控制器显示了该过程,我们检索了NEO服务并发布了Cypher查询以检索所有用户。
然后将用户集合传递到index.html.twig模板。
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>
启动内置的PHP服务器并欣赏您的工作:
<span><!DOCTYPE html> </span><span><html lang="en"> </span><span><head> </span> <span><meta charset="utf-8"> </span> <span><meta http-equiv="X-UA-Compatible" content="IE=edge"> </span> <span><meta name="viewport" content="width=device-width, initial-scale=1"> </span> <span><meta name="description" content=""> </span> <span><meta name="author" content=""> </span> <span><title>My first Neo4j application</title> </span> <span><!-- Bootstrap core CSS --> </span> <span><link href="{{ app.request.basepath }}/assets/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> </span> <span><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> </span> <span><!--[if lt IE 9]> </span> <span><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> </span> <span><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> </span> <span><![endif]--> </span> <span><style> </span> body <span>{ padding-top: 70px; } </span> <span></style> </span><span></head> </span><span><body> </span> <span><div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> </span> <span><div class="container"> </span> <span><div class="navbar-header"> </span> <span><button type="button" id="collbut" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> </span> <span><span class="sr-only">Toggle navigation</span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span></button> </span> <span><a class="navbar-brand" href="#">My first Neo4j application</a> </span> <span></div> </span> <span></div> </span><span></div> </span> <span><div class="container-fluid"> </span> <span>{% block content %} </span> <span>{% endblock content %} </span> <span></div> </span><span></body> </span><span></html></span>
社交网络功能:显示用户遵循谁
>现在我们要单击用户,并向他介绍他的详细信息和他关注的用户。
>步骤1:在index.php中创建路由
>步骤2:创建Showuser Controller Action
<span><span><?php </span></span><span> </span><span><span>namespace Ikwattro<span>\SocialNetwork\Controller</span>; </span></span><span> </span><span><span>use Silex<span>\Application</span>; </span></span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>; </span></span><span> </span><span><span>class WebController </span></span><span><span>{ </span></span><span> </span><span> <span>public function home(Application $application, Request $request) </span></span><span> <span>{ </span></span><span> <span>$neo = $application['neo']; </span></span><span> <span>$q = 'MATCH (user:User) RETURN user'; </span></span><span> <span>$result = $neo->sendCypherQuery($q)->getResult(); </span></span><span> </span><span> <span>$users = $result->get('user'); </span></span><span> </span><span> <span>return $application['twig']->render('index.html.twig', array( </span></span><span> <span>'users' => $users </span></span><span> <span>)); </span></span><span> <span>} </span></span><span><span>}</span></span>
工作流与任何其他应用程序相似,您尝试根据登录方式找到用户。
如果不存在,则显示一个404错误页面,否则您将用户数据传递到模板。{% extends "layout.html.twig" %} {% block content %} <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for user in users %} <span><span><span><li</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span>{% endblock %}
的链接
<span>cd spsocial/web </span>php <span>-S localhost:8000 </span><span>open localhost:8000</span>
>
<span>$app->get('/user/{login}', 'Ikwattro\SocialNetwork\Controller\WebController::showUser') </span> <span>->bind('show_user');</span>
添加建议
>下一步是向配置文件提供建议。我们需要通过添加可选的匹配来稍微扩展控制器中的Cypher查询,以根据第二度网络找到建议。
>
更新的控制器:
更新的模板:
您可以立即探索应用程序中的建议:
<span>public function showUser(Application $application, Request $request, $login) </span> <span>{ </span> <span>$neo = $application['neo']; </span> <span>$q = 'MATCH (user:User) WHERE user.login = {login} </span><span> OPTIONAL MATCH (user)-[:FOLLOWS]->(f) </span><span> RETURN user, collect(f) as followed'; </span> <span>$p = ['login' => $login]; </span> <span>$result = $neo->sendCypherQuery($q, $p)->getResult(); </span> <span>$user = $result->get('user'); </span> <span>$followed = $result->get('followed'); </span> <span>if (null === $user) { </span> <span>$application->abort(404, 'The user $login was not found'); </span> <span>} </span> <span>return $application['twig']->render('show_user.html.twig', array( </span> <span>'user' => $user, </span> <span>'followed' => $followed </span> <span>)); </span> <span>}</span>
{% extends "layout.html.twig" %} {% block content %} <span><span><span><h1</span>></span>User informations<span><span></h1</span>></span> </span> <span><span><span><h2</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></h2</span>></span> </span> <span><span><span><h3</span>></span>{{ user.property('login') }}<span><span></h3</span>></span> </span> <span><span><span><hr</span>/></span> </span> <span><span><span><div</span> class<span>="row"</span>></span> </span> <span><span><span><div</span> class<span>="col-sm-6"</span>></span> </span> <span><span><span><h4</span>></span>User <span><span><span</span> class<span>="label label-info"</span>></span>{{ user.property('login') }}<span><span></span</span>></span> follows :<span><span></h4</span>></span> </span> <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for follow in followed %} <span><span><span><li</span>></span>{{ follow.property('login') }} ( {{ follow.property('firstname') }} {{ follow.property('lastname') }} )<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> {% endblock %}
连接到用户(添加关系)
>为了连接到建议的用户,我们将向每个建议的用户添加一个邮政链接,其中包含两个用户作为隐藏字段。我们还将创建相应的路线和控制器操作。>
控制器动作:
<span>{ </span> <span>"require": { </span> <span>"silex/silex": "~1.1", </span> <span>"twig/twig": ">=1.8,<2.0-dev", </span> <span>"symfony/twig-bridge": "~2.3", </span> <span>"neoxygen/neoclient": "~2.1" </span> <span>}, </span> <span>"autoload": { </span> <span>"psr-4": { </span> <span>"Ikwattro\SocialNetwork\": "src" </span> <span>} </span> <span>} </span><span>}</span>
>在这里没什么不寻常的,我们匹配了开始用户节点和目标用户节点,然后我们合并了相应的后面关系。我们在关系上使用合并来避免重复的条目。
模板:
<span><span><?php </span></span><span> </span><span><span>require_once __DIR__.'/../vendor/autoload.php'; </span></span><span> </span><span><span>use Neoxygen<span>\NeoClient\ClientBuilder</span>; </span></span><span> </span><span><span>$app = new Silex<span>\Application</span>(); </span></span><span> </span><span><span>$app['neo'] = $app->share(function(){ </span></span><span> <span>$client = ClientBuilder<span>::</span>create() </span></span><span> <span>->addDefaultLocalConnection() </span></span><span> <span>->setAutoFormatResponse(true) </span></span><span> <span>->build(); </span></span><span> </span><span> <span>return $client; </span></span><span><span>}); </span></span><span> </span><span><span>$app->register(new Silex<span>\Provider\TwigServiceProvider</span>(), array( </span></span><span> <span>'twig.path' => __DIR__.'/../src/views', </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\MonologServiceProvider</span>(), array( </span></span><span> <span>'monolog.logfile' => __DIR__.'/../logs/social.log' </span></span><span><span>)); </span></span><span><span>$app->register(new Silex<span>\Provider\UrlGeneratorServiceProvider</span>()); </span></span><span> </span><span><span>$app->get('/', 'Ikwattro\SocialNetwork\Controller\WebController::home') </span></span><span> <span>->bind('home'); </span></span><span> </span><span><span>$app->run();</span></span>
>您现在可以单击您要关注的建议用户的关注按钮:
>
删除关系:
删除关系的工作流与添加新关系,创建路线,控制器操作并调整布局几乎相同:
:路线:
<span><!DOCTYPE html> </span><span><html lang="en"> </span><span><head> </span> <span><meta charset="utf-8"> </span> <span><meta http-equiv="X-UA-Compatible" content="IE=edge"> </span> <span><meta name="viewport" content="width=device-width, initial-scale=1"> </span> <span><meta name="description" content=""> </span> <span><meta name="author" content=""> </span> <span><title>My first Neo4j application</title> </span> <span><!-- Bootstrap core CSS --> </span> <span><link href="{{ app.request.basepath }}/assets/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> </span> <span><!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> </span> <span><!--[if lt IE 9]> </span> <span><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> </span> <span><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> </span> <span><![endif]--> </span> <span><style> </span> body <span>{ padding-top: 70px; } </span> <span></style> </span><span></head> </span><span><body> </span> <span><div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> </span> <span><div class="container"> </span> <span><div class="navbar-header"> </span> <span><button type="button" id="collbut" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> </span> <span><span class="sr-only">Toggle navigation</span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span><span class="icon-bar"></span> </span> <span></button> </span> <span><a class="navbar-brand" href="#">My first Neo4j application</a> </span> <span></div> </span> <span></div> </span><span></div> </span> <span><div class="container-fluid"> </span> <span>{% block content %} </span> <span>{% endblock content %} </span> <span></div> </span><span></body> </span><span></html></span>
控制器动作:
<span><span><?php </span></span><span> </span><span><span>namespace Ikwattro<span>\SocialNetwork\Controller</span>; </span></span><span> </span><span><span>use Silex<span>\Application</span>; </span></span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>; </span></span><span> </span><span><span>class WebController </span></span><span><span>{ </span></span><span> </span><span> <span>public function home(Application $application, Request $request) </span></span><span> <span>{ </span></span><span> <span>$neo = $application['neo']; </span></span><span> <span>$q = 'MATCH (user:User) RETURN user'; </span></span><span> <span>$result = $neo->sendCypherQuery($q)->getResult(); </span></span><span> </span><span> <span>$users = $result->get('user'); </span></span><span> </span><span> <span>return $application['twig']->render('index.html.twig', array( </span></span><span> <span>'users' => $users </span></span><span> <span>)); </span></span><span> <span>} </span></span><span><span>}</span></span>
>您可以在这里看到我使用匹配以找到两个用户之间的关系
我在关系中添加了一个标识符,以便能够删除它。
>
{% extends "layout.html.twig" %} {% block content %} <span><span><span><ul</span> class<span>="list-unstyled"</span>></span> </span> {% for user in users %} <span><span><span><li</span>></span>{{ user.property('firstname') }} {{ user.property('lastname') }}<span><span></li</span>></span> </span> {% endfor %} <span><span><span></ul</span>></span> </span>{% endblock %}
图形数据库非常适合关系数据,并且将其与PHP和NeoClient一起使用很容易。
Cypher是一种方便的查询语言,您会很快喜欢,因为可以自然地查询图形。
>
来发现更多信息。
查看Neo4J用户提供的用例和示例,并在Twitter上关注 @neo4j。
>使用neo4j
>将社交网络功能添加到PHP应用程序的常见问题
>
如何为我的PHP应用程序安装和配置NEO4J?要安装neo4j,您需要从官方网站下载最新版本,并按照安装说明进行操作。安装后,您可以通过编辑通常位于Neo4J安装的“ conf”目录中的配置文件来配置它。然后,您可以使用Neo4J PHP客户端将其连接到您的PHP应用程序。> PHP 7.4、8.1和8.3中可以增强我的应用程序的新功能是什么? PHP 8.1带来了枚举,纤维和仅阅读特性。 PHP 8.3虽然尚未发布,但有望引入新功能,以进一步增强您的应用程序。这些功能可以改善您的PHP应用程序的性能,可读性和可维护性。
>
>如何使用neo4j?
>
>在社交网络功能上使用neo4j胜过其他数据库有什么好处?与其他类型的数据库相比,图形数据库本质上更适合社交网络功能。它允许对社交网络中常见的复杂关系进行有效的查询和处理。它还提供了高性能,可伸缩性和灵活性。>
如何将我的PHP应用程序迁移到较新版本?将您的PHP应用程序迁移到较新版本涉及更新您的PHP安装,更新您的代码以删除不弃用的功能并使用新功能,并测试您的应用程序以确保其正常工作。建议在将更改应用于生产环境之前先在开发环境中进行此操作。>在将社交网络功能添加到PHP应用程序中时有什么共同的挑战,我该如何克服它们? 🎜>一些常见的挑战包括处理大量数据,管理复杂的关系以及确保实时绩效。可以通过使用诸如neo4j之类的合适数据库,优化查询以及使用有效的数据结构和算法来克服这些。>
>如何使用neo4j?> >您如何优化我的PHP应用程序的性能可以通过使用有效的查询,索引数据以及使用Neo4J的内部性能调整功能来优化使用NEO4J的PHP应用程序的性能。您还可以使用PHP的性能增强功能,例如JIT编译和预加载。>
>如何使用neo4j?>>
>您可以通过使用Safe Secure使用Neo4J使用Neo4J来保护您的PHP应用程序。连接,实施身份验证和授权以及使用NEO4J的内置安全功能。您还应遵循最佳实践,以实现PHP安全性,例如验证输入,使用准备好的语句以及保持PHP安装的最新时间。>我在哪里可以找到有关将NEO4J与PHP一起使用的更多资源?也有许多在线课程,书籍和博客深入涵盖此主题。
>
以上是使用neo4j添加社交网络功能的详细内容。更多信息请关注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.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。
