Codeigniter:自动连接到Neo4J数据库
我一直在使用codeigniter 2.x的个人项目。数据库是MySql,但我决定迁移到Neo4J。Codeigniter:自动连接到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);
我在笨一直在寻找周围,我似乎无法找到解决的办法,由于缺乏了解的一些核心概念。
你有一个想法如何继续。
谢谢。
Loïc。
我的目标是在每次页面加载时自动连接到Neo4J数据库,而不是每次我想访问时都要手动连接到数据库。我还担心不能修改任何codeigniter系统文件。
编辑:更新的解决方案。我的第一个解决方案是有问题的,因为它需要模型调用控制器来获取DB对象。这是不切实际的,违反了MVC工作流程,它是控制者应该调用模型,而不是其他方式。
更新的解决方案:
对于这个解决方案,我们需要创建两件事情:
- 一个新库类
- 一个新的控制器类
还,可选但建议使用:
- 修改配置文件,并插入你的数据库信息和凭据
1)创建应用程序的新库类/库
我们要创建一个库类,这将是由我们的新控制器加载和初始化,然后由我们的模型访问。
该库将只包含2个功能:
- 连接():执行到数据库的连接,并保存在私有类变量$ Neo4j的数据库对象。
- get_db():返回保存在功能数据库对象连接()
应用/库/ 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)在你的模型,您现在可以访问数据库对象,并用它来执行查询。从我的模型
//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)在你的控制器(这里称为测试),创建一个函数中,你会:
通过调用$这个 - > get_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数据库。
Loïc。
看起来不错。我刚开始使用Neo4j和graphaware,并提出几乎完全相同的解决方案。我不想在任何地方实例化graphaware客户端,所以我建立了一个db类作为我的应用程序和驱动程序的其余部分之间的桥梁。效果很好,保持一切清洁。 – Bryan
布莱恩你好。我实际上修改了解决方案,因为我无法从我的模型中调用我的控制器来访问数据库对象(无论如何,这是不好的做法,因为它会破坏MVC工作流程)。所以我所做的就是创建一个负责连接到neo4j db的库。控制器在其构造函数中调用库以启动连接,并将db对象保存在库类中。之后,从我的模型中,我只需要调用$ this-> neo4j-> get_db()来获得我的db对象。对不起,我忘了用新的解决方案更新我的帖子。 –
通常你会创建一个neo4j服务来创建连接一次,然后在需要的地方注入这个服务。也许在google上查找Codigniter + DependencyInjection。我是GraphAware客户端的维护者,但我没有使用CI的经验。 –
谢谢你的帮助Christophe,但我采用了不同的解决方案。卢瓦克。 –