2013-01-11 18 views
6

Próbuję teraz nauczyć się, jak połączyć się z serwerem Neo4j i uruchomić kwerendę Cyphera za pomocą Bulbflow z Pythona. I rzecz nie rozumiem jest różnica między dwoma możliwościami, aby połączyć się z serwerem neo4j:Bulbflow: różnica między neo4jserver Graph a neo4jserver Neo4jclient

1) Graph

from bulbs.neo4jserver import Graph 
g = Graph() 

2) Neo4jClient

from bulbs.neo4jserver import Neo4jClient 
client = Neo4jClient() 

Czy ktoś proszę wyjaśnić koncepcyjne różnica tutaj? A w jaki sposób lepiej jest wybrać, czy chcę wykonać (całkiem dużo) cypherów na serwerze, a ostatecznie równolegle?

PS: nie mam wystarczająco dużo reputacji, aby utworzyć tag "bulbflow" na to pytanie :)

Odpowiedz

13

Bulbs obsługuje trzy różne serwery baz danych wykresu - Neo4j Server, Rexster, a teraz Titan.

Kod specyficzny dla każdego serwera zaplecza znajduje się w jego własnym pakiecie (katalogu) Python. Powinieneś zobaczyć katalogi dla: neo4jserver, rexster Titan:

Neo4jClient jest adapter niskiego poziomu dla Neo4j Server - zazwyczaj nie ma potrzeby korzystania z tego bezpośrednio, chyba że robisz coś niestandardowego - zamiast tego użyj klasy Graph wysokiego poziomu.

Zobacz docs Żarówki ...

Przewodnik Cebulki Szybki przedstawiono przykłady dotyczące korzystania z interfejsu Graph:

Jednak obiekty Bulbs zawsze mają dostęp do klienta niskiego poziomu, gdy jest on potrzebny, za pośrednictwem _client var.

Żarówka jest przykładową aplikacją, którą stworzyłem, aby pokazać, jak używać i dostosowywać modele Żarówek - jest to silnik blogowy Python, który używa Git do kontroli źródła i graficznej bazy danych dla trwałości.

żarówkę został pierwotnie zaprojektowany do użytku z wolnej Neo4j Heroku Add On, ale obie żarówki i żarówkę w ogromnym stopniu korzystają z Gremlin i Neo4j Heroko Add On nie oferuje już Gremlin w wolnej wydanie.

Plik modelu Żarówka zawiera silnie dostosowanych Entry model i niestandardowej klasy Graph - model Entry korzysta z klientem niskopoziomowych:

As można zobaczyć w modelu Entry, mam dostęp do klienta niskiego poziomu za pośrednictwem _client var, i używam go, aby uzyskać skrypt Gremlin z biblioteki scripts, a następnie ponownie, aby wykonać skrypt Gremlina.

Oto kod dla Gremlin skryptu save_blog_entry używane przez model aktu:

Uwaga: istnieje tylko jeden skrypt Gremlin w pliku, ale jest duży, zawiera kilka operacji i wszystko jest zawinięte w transakcję. Umieszczenie wszystkich operacji w pojedynczym skrypcie Gremlin pozwala na wykonanie jednej operacji transakcyjnej za pomocą , a nie na obciążenie związane z wysyłaniem wielu żądań do serwera.

Chyba że robisz coś takiego dostosowywania modelu, normalnie można użyć obiektu scripts i obiekt gremlin przechowywane na obiekcie :

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> script = g.scripts.get('some_script') 
>>> params = dict(name="James", city="Dallas") 
>>> g.gremlin.execute(script, params) 

Zobacz docs Cebulki Neo4j gremlin ...

Podobnie, jeśli chcesz wykonać kwerendę Neo4j Cypher, użyj obiektu cypher przechowywanego na obiekcie .

Istnieją trzy metody Cypher (niestety nie są one udokumentowane na stronie internetowej jeszcze):

  1. g.cypher.query(): Używane po powrocie listę węzłów/relacji - będzie inicjować je do obiektów.
  2. g.cypher.table(): Używane, gdy zwracane są dane tabeli Cyphera.
  3. g.cypher.exectue(): Używane, gdy zwracane są arbitralne dane - zwraca ogólny obiekt Response.

Możesz sprawdzić kod źródłowy, aby zobaczyć, jak działają ...

Oto przykłady zastosowania zapytanie szyfruje() sposobu (zapytanie prostu powraca związek)

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 

Sposób zapytania automatycznie inicjuje elementy do ich typu. Jeśli element został utworzony jako model niestandardowy, Bulbs spróbuje zainicjować go do określonego typu, w przeciwnym razie będzie domyślnie generyczny Vertex lub Edge.

Należy zauważyć, że metoda zapytania Bulbs Cypher zwraca iterator.

Można pętli iteracyjnej nad ...

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> for edge in edges: print edge 

... lub przekonwertować go do listy ...

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> list(edges) 

... lub dostać następny element ...

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> edges.next() 

Proszę dać mi znać, jeśli masz więcej pytań.

+0

dzięki za bardzo szczegółową odpowiedź z przykładami. – npobedina

+1

Opcje zapytań typu "cypher" naprawdę mnie zaskoczyły, dopóki nie natknąłem się na to. Byłoby bardzo pomocne, aby znaleźć .query(), .table() i .execute() w dokumentacji! W przeciwnym razie jestem fanem żarówek - dzięki! – zanbri

+0

Czy moduł nadal działa, ponieważ nie był aktualizowany przez długi czas? – badc0re