pátek 26. prosince 2014

Neo4J

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čí.


1
graphDb.shutdown();


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

Žádné komentáře:

Okomentovat