Використання графічної бази даних Neo4j: частина 1-а

19.01.2016
Використання графічної бази даних Neo4j: частина 1-а
Автор:

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 для кешування.

2 votes, Рейтинг: 5

Також по темі

1

Почувайтеся, як удома, але не забувайте, що ви...на хостинг-сервері :) Хороший хостинг-провайдер ніколи такого не скаже! Адже вашому сайту потрібне по-справжньому надійне та “комфортне” розміщення...

2

Щось магічне наближається! Його можна відчути в повітрі. Дзвенять дзвоники, мерехтять вогники, всі шукають подарунки. Посеред цієї приємної метушні ми не забули сказати вам дещо важливе. Так, так...

3

У цьому блозі ви дізнаєтеся про один з найбільш об’єктивних методів тестування, а саме A/B тестування. Цікаво що це? Це можливість провести тестування юзабіліті сайту або тестування його якості, а...

4

Ефективний лендінг є основою успішного онлайн маркетингу, проте процес створення першокласної лендінг-сторінки може бути досить нелегким і ставити серйозні виклики. Насправді існує багато способів...

5

Розробники Google стверджують, що мають надати можливість користувачам побачити верхню частину сайту швидше, ніж за одну секунду, і...

Subscribe to our blog updates