Codeigniter: автоматическое подключение к базе данных Neo4J

Я использую 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, я не могу найти решение, из-за отсутствия понимания некоторых основных концепций.

У вас есть идея, как поступить.

Благодарю.

Лоик.

1

Решение

Моя цель состояла в том, чтобы автоматически подключаться к базе данных Neo4J при каждой загрузке страницы, и мне не нужно было вручную подключаться к базе данных каждый раз, когда я хотел получить к ней доступ. Мое беспокойство было также не изменять любой из системных файлов codeigniter.

редактировать : Обновленное решение. Мое первое решение было проблематичным, поскольку требовалось, чтобы модель вызывала контроллер для получения объекта БД. Это было непрактично и нарушало рабочий процесс MVC, где именно контроллер должен вызывать модель, а не наоборот.

Обновленное решение:

Для этого решения нам нужно создать 2 вещи:

  • Новый библиотечный класс
  • Новый класс контроллеров

Также необязательно, но рекомендуется:

  • Измените файл конфигурации и вставьте ваши данные и учетные данные БД

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) В вашем контроллере (здесь он называется 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.

Лоик.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]