Knihovna pro práci s grafovýni databázemi Neo4J je implementována v programovacím jazyce Java. Tato grafová knihovna využívá dotazovacího jazyka Cipher a její domovká stránka je na adrese
http://neo4j.com/. Na těchto stránkach je taktéž k dispozici stažení knihovny určené pro komunitu a tedy zdarma pod licencí Apache 2.0. Neo4J je možné získat i v komerční verzi.
Používat grafovou knihovnu Neo4J lze několika způsoby. Jedním ze způsobů je spuštění databázového serveru používání pomocí prohlížeče (viz Cipher). Další možností je Java API.
Cipher
Po stažení balíku s databází lze spustit následující příkaz, který spustí databázový server:
./bin/neo4j console
Následně lze v prohlížeči navštívit stránku
http://localhost:7474/, kde je k dispozici manuál, rychlý tutoriál a hlavně příkazová řádka pro příkazy (dotazy) v jazyce Cipher.
Jazyk Cipher je deklarativního typu. Jeho syntace byla pro větší intuitivnost inspirována jazykem relačních databází databází SQL. Tímto jazykem se nezadávají příkazy způsobem "jak chci hledat", ale "co chci najít".
Vytvoření hrany:
CREATE (ee:Person { name: "Emil", from: "Sweden" })
Tímto příkazem bude pomocí jazyka Cipher v databázi vytvořena hrana označená jako "
Person". Tato hrana bude mít vlastnosti
name s hodnotou
Emil a
from s hodnotou
Sweden.
Tvorba hran:
MATCH (ee:Person) WHERE ee.name = "Emil"
MATCH (ef:Person) WHERE ef.name = "Franta"
CREATE (ee)-[:KNOWS {since:1989}]->(ef)
Zde jsem si vyhledal vrchol s vlastností
name, která má hodnotu
"Emil" a uložil jsem si tento vrchol do proměnné
ee. Podobně do proměnné
ef jsem vložil vrchol s vlastností
name, které má hodnotu "Franta" a následně vytvořil vztah s typem
KNOWS a vlastností
since s hodnotou "1989".
Dotaz na Emila a jeho známé:
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Franta" RETURN ee, friends
Díky tohoto dotazu je možné vyhledat všechny uzly, které mají vztah s uzlem, který má vlastnost
name s hodnotou "Franta". Dalším specifikem musí být typ vztahu
KNOWS. Dále se vykreslí příp. vypíše výsledek příkazu, který je možné vidět na následujícím obrázku.
Java API
Pro vytvoření databáze Neo4J s využitím Java API je potřeba vytvořit instanci třídy
GraphDatabaseService. Vytvoření databáze tak i spustí databázový server. Při instanciaci je potřeba zadat parametr, který značí adresu v souborovém systému k úložišti. Např:.
1
| private static final String DB_PATH = "/home/greg/Plocha/test-data";
|
Vytvoření databáze a spuštění databázového serveru se potom provádí takto:
1
| GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
|
Následující příkaz potom náš databázový server zase ukončí.
Veškerá manipulace s databází probíha v transakcích a proto je potřeba po každé takovéto transakci zadat příkaz pro potvrzení transakce. Navíc je nutné tuto manipulaci s ukončovacím potvrzením kvůli možným chybám uzavřít do klauzule pro odchytávání vyjímek.
1
2
3
4
5
| try ( Transaction tx = graphDb.beginTx() )
{
// Database operations go here
tx.success();
}
|
Vytvoření vrcholu a hrany je potom vidět až na komplexnějším příkladu. Dále přikládám funkční jednoduchý příklad, který vytvoří dva vrcholy, mezi nimi jednu hranu a následně vypíše hodnotu jedné vlastnosti každého tohoto elementu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| package priklady;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class priklady {
/**
* @param args
*/
private static enum RelTypes implements RelationshipType
{
KNOWS,
UNKNOWS;
}
private static final String DB_PATH = "/home/greg/Plocha/test-data";
public static void main(String[] args) {
GraphDatabaseService graphDb;
Node firstNode;
Node secondNode;
Relationship relationship;
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
registerShutdownHook( graphDb );
try ( Transaction tx = graphDb.beginTx() )
{
//create data
firstNode = graphDb.createNode();
firstNode.setProperty( "message", "Hello, " );
secondNode = graphDb.createNode();
secondNode.setProperty( "message", "World!" );
relationship = firstNode.createRelationshipTo( secondNode, RelTypes.KNOWS );
relationship.setProperty( "message", "brave Neo4j " );
// select data
System.out.print( firstNode.getProperty( "message" ) );
System.out.print( relationship.getProperty( "message" ) );
System.out.print( secondNode.getProperty( "message" ) );
// let's remove the data
firstNode.getSingleRelationship( RelTypes.KNOWS, Direction.OUTGOING ).delete();
firstNode.delete();
secondNode.delete();
// Database operations go here
tx.success();
}
graphDb.shutdown();
}
private static void registerShutdownHook(GraphDatabaseService graphDb) {
// TODO Auto-generated method stub
}
}
|
Zdroje:
http://neo4j.com/
http://neo4j.com/developer/cypher-query-language/
http://neo4j.com/docs/stable/tutorials.html
http://neo4j.com/docs/stable/tutorials-java-embedded-hello-world.html