Bulbflow: разница между neo4jserver Graph и neo4jserver Neo4jclient

Сейчас я пытаюсь узнать, как подключиться к серверу Neo4j и выполнить запросы Cypher на нем, используя Bulbflow из Python. И что я не понимаю, так это различие между двумя возможностями подключения к серверу neo4j:

1) График

from bulbs.neo4jserver import Graph
g = Graph()

2) Neo4jClient

from bulbs.neo4jserver import Neo4jClient
client = Neo4jClient()

Может ли кто-нибудь объяснить здесь концептуальную разницу? И какой путь лучше выбрать, если я затем хочу выполнять (довольно много) запросов Cypher к серверу и, в конечном счете, параллельно?

PS: мне не хватает репутации для создания тега "луковица" для этого вопроса:)

1 ответ

Решение

Bulbs поддерживает три разных графовых сервера базы данных - Neo4j Server, Rexster и теперь Titan.

Код, специфичный для каждого внутреннего сервера, содержится в его собственном пакете (каталоге) Python. Вы должны увидеть каталоги для: neo4jserver, rexster, titan:

Neo4jClient это низкоуровневый адаптер для Neo4j Server - вам обычно не нужно использовать это напрямую, если вы не делаете пользовательские вещи - используйте вместо этого высокоуровневый класс Graph.

Смотрите документы по лампочкам для...

В Руководстве по быстрому запуску лампочек приведены примеры использования Graph интерфейс:

Однако ваши объекты Bulbs всегда имеют доступ к низкоуровневому клиенту, когда вам это нужно через _client вар.

Lightbulb - это пример приложения, которое я создал, чтобы показать, как использовать и настраивать модели Bulbs - это блог-движок Python, который использует Git для управления исходным кодом и графическую базу данных для сохранения.

Изначально Lightbulb был разработан для использования с бесплатной надстройкой Neo4j Heroku, но лампочки и лампочки интенсивно используют Gremlin, а дополнение Neo4j Heroko больше не предлагает Gremlin в бесплатной версии.

Файл модели лампочки содержит сильно настроенный Entry модель и обычай Graph класс - Entry В модели используется низкоуровневый клиент:

Как вы можете видеть в Entry модель, у меня есть доступ к клиенту низкого уровня через _client var, и я использую его, чтобы получить скрипт Gremlin из scripts библиотека, а затем снова выполнить сценарий Gremlin.

Вот код для save_blog_entry Скрипт Gremlin, используемый моделью Entry:

ПРИМЕЧАНИЕ. В файле есть только один скрипт Gremlin, но он большой, содержит несколько операций и все заключено в транзакцию. Помещение всех операций в один скрипт Gremlin позволяет вам делать все в одном транзакционном запросе, вместо того, чтобы накладывать издержки на отправку нескольких запросов на сервер.

Если вы не делаете что-то вроде настройки модели, вы обычно используете scripts объект и gremlin объект хранится на graph объект:

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

Смотреть Луковицы Neo4j Гремлин документы...

Аналогично, когда вы хотите выполнить запрос Neo4j Cypher, используйте cypher объект хранится на graph объект.

Существует три метода Cypher (к сожалению, их пока нет на сайте):

  1. g.cypher.query(): Используется при возврате списка узлов / связей - он инициализирует их для объектов.
  2. g.cypher.table(): Используется при возврате данных таблицы Cypher.
  3. g.cypher.exectue(): Используется при возврате произвольных данных - возвращает общий Response объект.

Вы можете посмотреть на исходный код, чтобы увидеть, как они работают...

Вот несколько примеров использования метода запроса Cypher () (запрос просто возвращает отношение):

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

Метод запроса автоматически инициализирует элементы по их типу. Если вы создали элемент как пользовательскую модель, Bulbs попытается инициализировать его конкретным типом, в противном случае по умолчанию будет использоваться универсальный тип. Vertex или же Edge,

Обратите внимание, что метод query() от Bulbs Cypher возвращает итератор.

Вы можете перебрать итератор...

>>> 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

... или преобразовать его в список...

>>> 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)

... или получить следующий предмет...

>>> 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()

Пожалуйста, дайте мне знать, если у вас есть еще вопросы.

Другие вопросы по тегам