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 consoleNá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"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".
MATCH (ef:Person) WHERE ef.name = "Franta"
CREATE (ee)-[:KNOWS {since:1989}]->(ef)
Dotaz na Emila a jeho známé:
MATCH (ee:Person)-[:KNOWS]-(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.
WHERE ee.name = "Franta" RETURN ee, friends
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