介绍Neo4j符号束

  • A+
所属分类:PHPSTUDY

为什么是图表?

不管你在哪里看,都没有什么信息是不相连的--人、事件、地点、事物、文件、应用程序和关于它们的信息都是紧密相连的。随着数据量的增长,其连接的数量和动态也随之增加。如果你过去尝试过在任何数据库中存储和查询高度连接的半结构化数据,你可能会遇到很多挑战。

介绍Neo4j符号束插图

本地图形数据库中的标记属性图

Neo4j它是为了准确地处理真实世界的信息而构建的,而不影响与实体相关的连接的数量和类型。它是一个开源的NoSQL数据库,它使用标有标签的属性图将域模型(图表)的实体存储为节点他们之间的联系关系每个属性都可以具有任意属性。

介绍Neo4j符号束插图1

Neo4j不仅是另一个数据库之上的一个图形层,而且是一个成熟的、事务性(ACID)数据库,从管理磁盘上的记录页到提供可伸缩的、安全的集群。作为一个本地图形数据库,它使用专用的数据结构来高效地存储和查询高连接的数据。与其他数据库不同,(复杂的)连接查询不会在查询时重复计算。相反,实体之间的关系是直接存储的。在查询期间,数据库引擎可以使用直接记录指针进行固定时间查找。

开放CYPHER查询语言

这不仅扩展到建模或存储,甚至Neo4j附带的CYPHER图形查询语言也专注于图形模式,这一次表示为查询中的ASCII-art:

1
(dan:Person {name:"Dan"})-[:LOVES]->(ann:Person {name:"Ann"})

,这使得您的查询即使对于非开发人员也非常容易阅读,例如,下面是一个推荐查询(“像您这样的客户也购买了这个”):


1
2
3
4
MATCH (c:Customer)-[:BOUGHT]->(:Product)<-[:BOUGHT]-(o:Customer)-[:BOUGHT]->(reco:Product)
WHERE c.id = 123 AND NOT (c)-[:BOUGHT]->(reco)
RETURN reco.name, count(*) as frequency
ORDER BY frequency DESC LIMIT 10;

Symfony,PHP的快速开发框架

塞福尼是现代PHP框架的角色模型。该框架有一个组成部分的方法,过去11年来一直存在。从Symfony生态系统中,我们看到了一些项目,如Composer、Twig、Swiftmailer、Assetic、Monolog等等。由于采用了组件方法,其他项目和框架很容易重用Symfony中的代码。像Laravel,Silex,Sylius,Drupal,phpBB,ez这样的项目都使用Symfony组件。

Symfony成功的一个关键因素是框架的灵活性和易用性。Symfony的标准版本附带了Doctrine作为默认的数据库层抽象,它支持MySQL和MongoDB这样的主要数据库。但是,无论是数据库层还是理论,都不是Symfony的主要公民。它们很容易被别的东西取代。

介绍Symfony Neo4j丛

为了在Neo4j和Symfony之间提供一个平滑的集成,我们创建了SymfonyNeo4jBundle。它用Graphaware包装了优秀的PHP社区客户端,并创建了一个坚实的Symfony体验。由于WebProfiler集成,您将看到所有数据库调用、所有查询及其结果。您甚至可以查看与数据库交互时引发的任何异常。您还将获得关于每个数据库调用的详细统计信息。这使得调试应用程序变得更加容易。

包还将客户端事件与Symfony事件分派程序集成在一起。现在您可以创建事件订阅者,它可以监听与Neo4j的交互,例如,用于集成MonologBundle来记录所有数据库查询。

在如何使用Neo4j时,包并不是固执己见的。使用OGM是可选的。高级Neo4j用户将完全控制客户端和执行什么CYPHER。

类似API的原则

对于熟悉Doctrine的开发人员,他们将知道如何使用GraphAware的OGM(ObjectGraphMapper)。OGM有一个EntityManager实现Doctrine的ObjectManager接口,它为您提供“查找”、“删除”、“持久化”和“刷新”等功能。与Doctrine的MySQLEntityManager相比,开发人员将拥有与Neo4j OGM的模型完全相同的工作经验。

配置

与大多数现代框架一样,Symfony将配置与代码分开。这是Neo4jBundle坚持的良好软件实践。它提供了轻松配置多个连接、多个客户端和多个实体管理器的能力。对于每个连接,您可以决定是否要使用HTTP或新的二进制“螺栓”协议。

由于Symfony的配置组件,您可以使用YAML、XML或PHP来指定配置。默认配置将设置一个连接到

1
127.0.0.1:7474

默认用户名/密码。

开始使用Symfony-Neo4j-Bundle

后安装捆绑包你可以开始使用客户端


1
2
3
4
5
6
$client = $this->get('neo4j.client');
$results = $client->run('MATCH (n:Movie) RETURN n LIMIT 5');
foreach ($results->records() as $record) {
$node = $record->get('n');
echo $node->get('title'); // "The Matrix"
}

如果您习惯了原则,您可能需要使用OGM。您需要向您的模型添加注释,以便OGM能够正确地理解和映射这些属性。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
use GraphAwareNeo4jOGMAnnotations as OGM;
/**
* @OGMNode(label="User")
*/
class User
{
/** @OGMGraphId() */
protected $id;
/** @OGMProperty(type="string") */
protected $name;
/** @OGMProperty(type="int") */
protected $age;
// Getters and setters
}

1
2
3
4
5
6
7
$em = $this->get('neo4j.entity_manager');
$bart = new User('Bart Johnson', 33);
$em->persist($bart);
$em->flush();
// Retrieve from database
$john = $em->getRepository(User::class)->findOneBy('name', 'John Doe');
echo $john->getAge();

下面是分析器可能是什么样子的示例:

介绍Neo4j符号束插图2

关系与关系实体

与Doctrine和MySQL的主要区别在于,在Neo4j中,关系是一流的公民。它们和节点本身一样重要。若要在个人和电影之间创建简单关系,请使用

1
@OGMRelationship

注释


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use GraphAwareNeo4jOGMAnnotations as OGM;
use GraphAwareNeo4jOGMCommonCollection;
/**
*
* @OGMNode(label="Person")
*/
class Person
{
/**
* @var int
*
* @OGMGraphId()
*/
protected $id;
// other code
/**
* @var Movie[]|Collection
*
* @OGMRelationship(type="ACTED_IN", direction="OUTGOING", collection=true, mappedBy="actors", targetEntity="Movie")
*/
protected $movies;
public function __construct()
{
$this->movies = new Collection();
}
// other code
/**
* @return Movie[]|Collection
*/
public function getMovies()
{
return $this->movies;
}
}

电影类有来自个人的新的关系。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use GraphAwareNeo4jOGMAnnotations as OGM;
use GraphAwareNeo4jOGMCommonCollection;
/**
*
* @OGMNode(label="Movie")
*/
class Movie
{
/**
* @var int
*
* @OGMGraphId()
*/
protected $id;
// other code
/**
* @var Person[]|Collection
*
* @OGMRelationship(type="ACTED_IN", direction="INCOMING", collection=true, mappedBy="movies", targetEntity="Person")
*/
protected $actors;
public function __construct()
{
$this->actors = new Collection();
}
// other code
/**
* @return Person[]|Collection
*/
public function getActors()
{
return $this->actors;
}
}

关系本身也可以具有属性。例如,如果用户对电影评分,那么这种关系可能会有分数。这可以通过关系实体来实现。在OGM文件.

示例项目

有一个示例项目,您可以使用它来测试包。使用以下步骤安装项目:


1
2
git clone git@github.com:neo4j-examples/movies-symfony-php-bolt.git
composer install

导入数据夹具(https://neo4j.com/developer/example-project/#_data_setup)


1
php bin/console server:run
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: