1

我一直在我的个人项目中使用 codeigniter 2.x。数据库是 MySql,但我决定迁移到 Neo4J。

我使用了已安装的名为 GraphAware 的库。到目前为止,它按预期运行。我的测试代码如下:

$user       = 'neo4j';
$password   = 'mypass';
$host       = 'myhost:7474';
$myDB       = 'mydb';

$client = ClientBuilder::create()
        ->addConnection('default','http://'.$user.':'.$password.'@'.$host.'/'.$myDB)
        ->build();

$query = "MATCH (n:user) RETURN n.username";

$result = $client->run($query);

到目前为止,一切都很好!

我的问题如下:如何在页面创建时自动连接到 neo4j 数据库,这样就不必每次都手动创建连接?

在我看来,上面的代码会变成这样:

$db = $this->db->load('neo4j');

$query = "MATCH (n:user) RETURN n.username";

$result = $db->run($query);

我一直在codeigniter中搜索,由于对一些核心概念缺乏了解,我似乎无法找到解决方案。

你知道如何进行吗?

谢谢。

洛伊克。

4

1 回答 1

0

我的目标是在每次页面加载时自动连接到 Neo4J 数据库,而不必每次我想访问它时手动连接到数据库。我还担心不要修改任何 codeigniter 系统文件。

编辑更新的解决方案。我的第一个解决方案是有问题的,因为它需要模型调用控制器来获取数据库对象。这是不切实际的,并且违反了 MVC 工作流程,在该工作流程中,应该由控制器调用模型,而不是相反。

更新的解决方案:

对于这个解决方案,我们需要创建两件事:

  • 一个新的库类
  • 一个新的控制器类

此外,可选但推荐

  • 修改配置文件并插入您的数据库详细信息和凭据

1)在应用程序/库中创建一个新的库类

我们想创建一个库类,它将由我们的新控制器加载和初始化,然后由我们的模型访问。

该库将仅包含 2 个功能:

  • connect():执行与数据库的连接并将数据库对象保存在私有类变量 $neo4j 中。
  • get_db() :返回保存在函数connect()中的数据库对象

应用程序/库/neo4j.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
require_once 'vendor/autoload.php';
use GraphAware\Neo4j\Client\ClientBuilder;

class Neo4j {
    private $neo4j;

    //connect to the neo4j database
    public function connect(){
        //load CI to access config files 
        $CI = & get_instance();

        //Get database details from the config file.
        $user       = $CI->config->item('username');
        $password   = $CI->config->item('password');
        $host       = $CI->config->item('hostname');
        $port       = $CI->config->item('port');
        $database   = $CI->config->item('database');

        //build connection to db
        $client = ClientBuilder::create()
                ->addConnection('default', 'http://'.$user.':'.$password.'@'.$host.':'.$port)
                ->build();

        //save the connection object in a private class variable
        $this->neo4j    = $client;
    }

    //Returns the connection object to the neo4j database
    public function get_db(){
        return $this->neo4j;
    }
}

2) 创建一个新的控制器,它将加载我们的 neo4j 库并执行数据库连接。

这一步也简单明了。我们创建一个新的控制器,它将扩展您当前的控制器类。我将此控制器称为Neo4j_controller

这个控制器只包含一个构造函数。我们真正想做的就是加载我们的 neo4j 库并启动数据库连接。

应用程序/核心/Neo4j_controller.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Neo4j_controller extends TNK_Controller{

    //connect to neo4j db on instantiation
    function __construct(){
        parent::__construct();
        //load the neo4j library that we created
        $this->load->library('neo4j');
        //connect to the db
        $this->neo4j->connect();
    }
}

3) 在您的模型中,您现在可以访问 DB 对象并使用它来执行查询。

我的一个模型的例子

//Return all sublists of list $list
    public function get_sublists($list){
        //Get the DB object by calling the get_db function from our neo4j library.
        //Since the neo4j library has been loaded by the controller, we can access it
        //by just calling $this->neo4j.
        $db = $this->neo4j->get_db();

        //Write your cypher query
        $query = "match (n:item_list{name:'$list'})-[:sublist*]->(sublist:item_list) sublist.name as list";

        //Run your query
        $result = $db->run($query);

        //Return the result. In this case, i call a function (extract_result_g)
        //that will neatly transform the response into a nice array.
        return $this->extract_results_g($result);   
    }

4)修改你的配置文件 (可选)

我对此有意见。最后,我创建了自己的名为 neo4jDatabase.php 的配置文件。

如果您在创建自己的配置文件或修改当前配置文件时也遇到问题,您仍然可以在 neo4j 库文件中硬编码数据库数据。这是不好的做法,但是当它必须起作用时,它就必须起作用。

neo4jDatabase.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['hostname'] = 'test.mysite.me';
$config['username'] = 'neo4j';
$config['password'] = 'my_password';
$config['database'] = 'mygraphdb';
$config['port']     = '7474';

/* End of file neo4jDatabase.php */
/* Location: ./application/config/neo4jDatabase.php */

这样就完成了更新的解决方案。另外,请注意我使用的是codeIgniter HMVC。所以我不知道我所做的一些事情是否只是因为这个才可能(比如从模型中调用一个库)。

请在下面找到旧的解决方案。它不应该被使用。

旧解决方案 (有问题,因为它需要您的模型调用您的控制器。这不应该发生)

对于这个解决方案,我只需创建一个新的控制器,任何希望使用 Neo4j 数据库的控制器都需要对它进行实例化。

1)我们创建一个新的控制器(这里叫Neo4j_controller)

新控制器:Neo4j_controller.php

require_once 'vendor/autoload.php';
use GraphAware\Neo4j\Client\ClientBuilder;

class Neo4j_controller extends Your_Normal_Controller{

    private $neo4j;

    //connect to db on instantiation
    function __construct(){
        parent::__construct();

        $this->connect();
    }

    //Connect to the neo4j db
    private function connect(){
       //I'll get these from config file later on
       $user       = 'neo4j';
       $password   = 'mypass';
       $host       = 'myhost:7474';
       $myDB       = 'mydb';

       //build connect to db 
       $client = ClientBuilder::create()
                ->addConnection('default', 'http://'.$user.':'.$password.'@'.$host.'/'.$myDB)
                ->build();
        //save the connection object in a private class variable
        $this->neo4j    = $client;
    }

    //Returns the connection object to the neo4j database
    public function get_db(){
        return $this->neo4j;
    }
}

2)让你的普通控制器实例化 Neo4j_controller

class Test extends Neo4j_controller {...}

3) 在您的控制器(此处称为测试)中,创建一个函数,您将在其中:

  • 通过调用 $this->get_db() 获取 DB 对象

  • 使用该对象执行您的查询

在我们的测试控制器中创建的函数,向 neo4j 数据库发送查询

public function db_query(){

    $db = $this->get_db();

    $query = "match (n:user) return n";

    print_r($db->run($query)->getRecords());
  }

当您调用函数 db_​​query 时,它会返回用户节点,而不需要我们手动编写任何代码来连接到 neo4j 数据库。

洛伊克。

于 2016-07-06T10:39:27.157 回答