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:
- Исходный код лампочки: https://github.com/espeed/bulbs/tree/master/bulbs
Neo4jClient
это низкоуровневый адаптер для Neo4j Server - вам обычно не нужно использовать это напрямую, если вы не делаете пользовательские вещи - используйте вместо этого высокоуровневый класс Graph.
Смотрите документы по лампочкам для...
- Серверный клиент Neo4j: http://bulbflow.com/docs/api/bulbs/neo4jserver/client/
- Серверный график Neo4j: http://bulbflow.com/docs/api/bulbs/neo4jserver/graph/
В Руководстве по быстрому запуску лампочек приведены примеры использования Graph
интерфейс:
- Быстрый запуск лампочек: http://bulbflow.com/quickstart/
Однако ваши объекты Bulbs всегда имеют доступ к низкоуровневому клиенту, когда вам это нужно через _client
вар.
Lightbulb - это пример приложения, которое я создал, чтобы показать, как использовать и настраивать модели Bulbs - это блог-движок Python, который использует Git для управления исходным кодом и графическую базу данных для сохранения.
- Лампочка: https://github.com/espeed/lightbulb
Изначально Lightbulb был разработан для использования с бесплатной надстройкой Neo4j Heroku, но лампочки и лампочки интенсивно используют Gremlin, а дополнение Neo4j Heroko больше не предлагает Gremlin в бесплатной версии.
Файл модели лампочки содержит сильно настроенный Entry
модель и обычай Graph
класс - Entry
В модели используется низкоуровневый клиент:
- Модель лампочки: https://github.com/espeed/lightbulb/blob/master/lightbulb/model.py
Как вы можете видеть в Entry
модель, у меня есть доступ к клиенту низкого уровня через _client
var, и я использую его, чтобы получить скрипт Gremlin из scripts
библиотека, а затем снова выполнить сценарий Gremlin.
Вот код для save_blog_entry
Скрипт Gremlin, используемый моделью Entry:
- Сценарии Гремлин лампочки: https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy
ПРИМЕЧАНИЕ. В файле есть только один скрипт 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 Gremlin: http://bulbflow.com/docs/api/bulbs/neo4jserver/gremlin/
Аналогично, когда вы хотите выполнить запрос Neo4j Cypher, используйте cypher
объект хранится на graph
объект.
Существует три метода Cypher (к сожалению, их пока нет на сайте):
g.cypher.query()
: Используется при возврате списка узлов / связей - он инициализирует их для объектов.g.cypher.table()
: Используется при возврате данных таблицы Cypher.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()
Пожалуйста, дайте мне знать, если у вас есть еще вопросы.