pandawan-technology/neo4j-data-fixtures

dev-master / 1.0.x-dev 2016-08-31 21:40 UTC

This package is auto-updated.

Last update: 2024-09-20 07:27:26 UTC


README

这个库将允许您将固定值数据加载到Neo4j图数据库中。它受到了Doctrine Data Fixtures 扩展的启发。

简单使用

您只需扩展此库提供的AbstractNeo4jFixture类即可

<?php

namespace MyNamespace\Fixtures;

use GraphAware\Common\Connection\ConnectionInterface;
use PandawanTechnology\Neo4jDataFixtures\AbstractNeo4jFixture;

class UserFixture extends AbstractNeo4jFixture
{
    public function load(ConnectionInterface $connection)
    {
        $connection->getSession()->run("CREATE (a:Person {name:'Arthur', title:'King'})");
    }
} 

现在您需要将此固定值注册到加载器中

<?php

namespace MyNamespace\Fixtures;

use PandawanTechnology\Neo4jDataFixtures\Loader;

$loader = new Loader();
$loader->addFixture(new UserFixture());

您还可以从目录中加载固定值

$loader->loadFromDirectory(__DIR__);

或指定一个文件

$loader->loadFromFile('./UserFixture.php');

最后,您可以得到您的固定值

$fixtures = $loader->getFixtures();

现在您可以运行固定值加载了

use PandawanTechnology\Neo4jDataFixtures\Executor;

$executor = new Executor($connection);
$executor->execute($loader->getFixtures());

如果您想在每次加载固定值时清除数据库,您将需要使用Purger

use PandawanTechnology\Neo4jDataFixtures\Executor;
use PandawanTechnology\Neo4jDataFixtures\Purger;

$purger = new Purger($connection);
$executor = new Executor($connection, $purger);
$executor->execute($loader->getFixtures());

Executor::execute()方法将接受第二个参数以忽略数据库删除。默认行为是删除数据,只要提供了Purger实例。

在您的固定值文件之间添加依赖关系

您可以在固定值中使用DependentFixtureInterface来添加依赖关系

<?php

namespace MyNamespace\Fixtures;

use GraphAware\Common\Connection\ConnectionInterface;
use PandawanTechnology\Neo4jDataFixtures\DependentFixtureInterface;
use PandawanTechnology\Neo4jDataFixtures\FixtureInterface;

class UserFixture implements DependentFixtureInterface
{
    public function getDependencies()
    {
        return ['MyNamespace\Fixtures\OrganizationFixture'];
    }

    public function load(ConnectionInterface $connection)
    {
        $connection->getSession()->run("CREATE (a:Person {name:'Arthur', title:'King'})");
    }
}
 
class OrganizationFixture implements FixtureInterface
{
    public function load(ConnectionInterface $connection)
    {
        // ...
    }
}

在您的固定值文件之间共享对象

如果您使用DependentFixtureInterface,那么您很可能需要在固定值文件之间共享对象。为了做到这一点,您可以使用setReference/addReference方法来分配一个引用(!)——最新的将确保唯一性——然后使用getReference方法来获取它

<?php

namespace MyNamespace\Fixtures;

use GraphAware\Common\Connection\ConnectionInterface;
use PandawanTechnology\Neo4jDataFixtures\DependentFixtureInterface;
use PandawanTechnology\Neo4jDataFixtures\FixtureInterface;
 
class OrganizationFixture implements FixtureInterface
{
    public function load(ConnectionInterface $connection)
    {
        if (!$organizationStmt = $connection->getSession()->run("CREATE (s:Organization {name:'Pandawan Technology'}) RETURN id(o)")) {
            continue;
        }
        
        $this->addReference('organization-pandawan-technology', $organizationStmt->getRecord()->value('id(o)'));
    }
}

class UserFixture implements DependentFixtureInterface
{
    public function getDependencies()
    {
        return ['MyNamespace\Fixtures\OrganizationFixture'];
    }

    public function load(ConnectionInterface $connection)
    {
        $session = $connection->getSession();

        if (!$userStmt = $session->run("CREATE (a:Person {name:'Arthur', title:'King'}) RETURN id(a)")) {
            return;
        }

        $session->rund('MATCH (u:User), (o:Organization) WHERE id(u) = {user_id} AND id(o) = {organization_id} CREATE (u)-[r:BELONGS_TO]->(o) RETURN r', [
            'organisation_id' => $this->getReference('organization-pandawan-technology'),
            'user_id' => $userStmt->getRecord()->value('id(a)')
        ]);
    }
}