Neo4j — найбільш популярна графова база даних (NoSQL). На відміну від звичних MySQL чи PostgreSQL, дані тут зберігаються не у вигляді таблиці, а у вигляді графа, це дозволяє гнучко оперувати зв’язками між нодами, причому саме зв’язки поставлені на перше місце.
Коли доцільно використовувати графові бази даних (Neo4j)
Графові бази даних дають перевагу при роботі з даними, для яких зв’язки відіграють важливу роль, особливо якщо потрібно буде пройтись по зв’язках у кілька рівнів вглиб.
Гіганти IT, такі як Google, Facebook, LinkedIn і PayPal, активно використовують графові бази даних. Це дозволяє їм повністю розкрити потенціал взаємозв’язків. Графові бази даних значно швидше оперують високо пов’язаними даними, ніж реляційні і NoSQL бази даних, крім того, мають вбудовану підтримку графових алгоритмів.
Встановлення Neo4j (Ubuntu)
1) Завантажуємо Neo4j Community Edition з офіційного сайту
2) Розпаковуємо
tar -xf neo4j-enterprise-2.3.1-unix.tar.gz
3) Для зручності задаємо змінну оточення, де прописуємо шлях до папки, куди ми розпакували Neo4j, для цього можна додати таку стрічку у файл .bashrc (цей пункт не обов’язковий)
export NEO4J_HOME=/opt/neo4j-community-2.3.1
де /opt/neo4j-community-2.3.1 — це папка, куди ми розпакували Neo4j
4) Запускаємо
$NEO4J_HOME/bin/neo4j console
або
sudo $NEO4J_HOME/bin/neo4j console
де $NEO4J_HOME — це змінна, яку ми задали у 3-му пункті. Якщо цього не робили — потрібно вказати повний шлях.
Neo4j також можна запустити як сервіс командою
$NEO4J_HOME/bin/neo4j start
Якщо все вірно зробили, за цим лінком має бути адмінка Neo4j http://localhost:7474/browser/
Cypher
Cypher — це мова запитів, яка використовується у Neo4j.
Ось приклади деяких запитів:
MATCH (n)RETURN n LIMIT 100 — вибірка
MATCH (n {name:"p1"})
RETURN n
вибірка по полю name
CREATE (n:Person {name:"p2"})
RETURN n
створення (скрін аналогічний попередньому)
MATCH (n {name:"p2"})
DELETE n
видалення (у цьому запиті нічого не вертається, відповідно, скріну немає)
MATCH (a:Person),(b:Person)
WHERE a.name = 'p1' AND b.name = 'p2'
CREATE (a)-[r:RELTYPE]->(b)
RETURN r
задання зв’язку
MATCH (n:Person)
RETURN n
вибірка по типу (Person)
MATCH (node1)-[:RELTYPE]->(node2)-[:RELTYPE]->(node3)
RETURN node3
вибірка по зв’язках (два рівні вкладеності)
MATCH (node1:Person { name:'p2' })-[r]->(node2:Person)
RETURN r
вибір всіх зв’язків для заданої ноди
MATCH (node1:Person { name:'p2' })-[r]->(node2:Person { name:'p3' }) SET r.distance = 10
RETURN r
задання властивості для заданого зв’язку
MATCH (from:Person {name: 'p2'})-[:RELTYPE*1..100]->(to)
RETURN distinct to
вибірка нод, до яких можна дійти з заданої ноди через зв’язок RELTYPE у межах 1-100 кроків
MATCH p =(:Person { name: "p1" })-[:RELTYPE*0..5]-(:Person { name: "p5" }) RETURN extract(n IN nodes(p)| coalesce(n.name)) AS `names`, length(p) ORDER BY length(p)
LIMIT 10;
вибірка шляхів, по яких можна пройти від заданої точки до заданої точки у межах 0-5 кроків
MATCH (node1:Person { name:"p1" }),(node2:Person { name:"p5" }), p = shortestPath((node1)-[rels:RELTYPE*0..5]-(node2)) WHERE ALL (r IN rels WHERE NOT r.distance = 7)
RETURN p
знаходження найкоротшого шляху (тут найкоротший шлях — це шлях з найменшою кількістю проміжних нод), який би відповідав заданим вимогам
MATCH p=(startNode:Person { name:"p1" })-[rels:RELTYPE*1..4]->(endNode:Person { name:"p5" }) RETURN p AS shortestPath, reduce(distance=0, r in rels | distance + r.distance) AS totalDistance
LIMIT 1
знаходження найкоротшого шляху між вказаними нодами (тут найкоротший шлях — це той, для якого сума властивості distance для зв’язку RELTYPE є найменшою).
MATCH p=(startNode:Person { name:"p1" })-[rels:RELTYPE*1..4]->(endNode) WITH p, reduce(distance=0, r in rels | distance + r.distance) AS totalDistance WHERE totalDistance = 28
RETURN p
пошук всіх маршрутів, які мають задану суму властивості distance для зв’язку RELTYPE у межах 1-4 кроків
Як ми бачимо, Cypher є досить простою і водночас гнучкою мовою запитів, адаптованою відповідно до графового відображення даних.
Ось гайд по запитах Neo4j - http://neo4j.com/developer/cypher-query-language/
В наступній частині ми спробуємо використати на практиці набуті знання, і створимо API, використовуючи Neo4j як базу даних, phalconphp як фреймворк, neo4jphp як PHP врапер для Neo4j та Redis для кешування.