Codeigniter:自动连接到 Neo4J 数据库
Codeigniter : Automatic connection to Neo4J database
我一直在我的个人项目中使用 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 中搜索,由于对一些核心概念缺乏理解,我似乎找不到解决方案。
你知道如何进行吗。
谢谢。
Loïc.
我的 objective 是在每次页面加载时自动连接到 Neo4J 数据库,而不必每次我想访问它时都手动连接到数据库。我还担心不要修改 任何 codeigniter 系统文件。
编辑:更新了解决方案。我的第一个解决方案是有问题的,因为它需要模型调用控制器来获取 DB 对象。这是不切实际的,并且违反了 MVC 工作流程,在 MVC 工作流程中,控制器应该调用模型,而不是相反。
更新的解决方案:
对于这个解决方案,我们需要创建 2 个东西:
- 新图书馆class
- 新控制器class
另外,可选但推荐:
- 修改配置文件并插入您的数据库详细信息和凭据
1) 在application/libraries
中新建库class
我们想要创建一个库 class,它将由我们的新控制器加载和初始化,然后由我们的模型访问。
这个库将只包含 2 个函数:
- connect() :执行与数据库的连接并将数据库对象保存在私有 class 变量 $neo4j.
- get_db() : Returns 保存在函数 connect() 中的数据库对象
application/libraries/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 库并执行数据库连接。
这一步也简单明了。我们创建了一个新控制器,它将扩展您当前的控制器 class 是什么。我称这个控制器为Neo4j_controller.
这个控制器只包含一个构造函数。我们真正想要做的就是加载我们的 neo4j 库并启动数据库连接。
application/core/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)我们新建一个controller(这里叫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 时,它 returns 用户节点,无需我们手动编写任何代码来连接到 neo4j 数据库。
Loïc.
我一直在我的个人项目中使用 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 中搜索,由于对一些核心概念缺乏理解,我似乎找不到解决方案。
你知道如何进行吗。
谢谢。
Loïc.
我的 objective 是在每次页面加载时自动连接到 Neo4J 数据库,而不必每次我想访问它时都手动连接到数据库。我还担心不要修改 任何 codeigniter 系统文件。
编辑:更新了解决方案。我的第一个解决方案是有问题的,因为它需要模型调用控制器来获取 DB 对象。这是不切实际的,并且违反了 MVC 工作流程,在 MVC 工作流程中,控制器应该调用模型,而不是相反。
更新的解决方案:
对于这个解决方案,我们需要创建 2 个东西:
- 新图书馆class
- 新控制器class
另外,可选但推荐:
- 修改配置文件并插入您的数据库详细信息和凭据
1) 在application/libraries
中新建库class我们想要创建一个库 class,它将由我们的新控制器加载和初始化,然后由我们的模型访问。
这个库将只包含 2 个函数:
- connect() :执行与数据库的连接并将数据库对象保存在私有 class 变量 $neo4j.
- get_db() : Returns 保存在函数 connect() 中的数据库对象
application/libraries/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 库并执行数据库连接。
这一步也简单明了。我们创建了一个新控制器,它将扩展您当前的控制器 class 是什么。我称这个控制器为Neo4j_controller.
这个控制器只包含一个构造函数。我们真正想要做的就是加载我们的 neo4j 库并启动数据库连接。
application/core/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)我们新建一个controller(这里叫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 时,它 returns 用户节点,无需我们手动编写任何代码来连接到 neo4j 数据库。
Loïc.