Я использую 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, я не могу найти решение, из-за отсутствия понимания некоторых основных концепций.
У вас есть идея, как поступить.
Благодарю.
Лоик.
Моя цель состояла в том, чтобы автоматически подключаться к базе данных Neo4J при каждой загрузке страницы, и мне не нужно было вручную подключаться к базе данных каждый раз, когда я хотел получить к ней доступ. Мое беспокойство было также не изменять любой из системных файлов codeigniter.
редактировать : Обновленное решение. Мое первое решение было проблематичным, поскольку требовалось, чтобы модель вызывала контроллер для получения объекта БД. Это было непрактично и нарушало рабочий процесс MVC, где именно контроллер должен вызывать модель, а не наоборот.
Обновленное решение:
Для этого решения нам нужно создать 2 вещи:
Также необязательно, но рекомендуется:
1) Создать новый класс библиотеки в приложении / библиотеки
Мы хотим создать класс библиотеки, который будет загружен и инициализирован нашим новым контроллером, а затем доступен для нашей модели.
Эта библиотека будет содержать только 2 функции:
Приложение / библиотеки / 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) В вашем контроллере (здесь он называется Test) создайте функцию, в которой вы будете:
Получить объект БД, вызвав $ this-> 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.
Лоик.
Других решений пока нет …