pytoneo client library and toolkit for working with neo4j

Py2neo is a client library and toolkit for working with Neo4j from within Python applications and from the command line

pip install --upgrade py2neo

>>> from py2neo import Graph
>>> graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
>>> graph.run("UNWIND range(1, 3) AS n RETURN n, n * n as n_sq")
   n | n_sq
-----|------
   1 |    1
   2 |    4
   3 |    9

Connection profiles

Workflow

class py2neo.GraphService(profile=None, **settings)[source] является средством доступа верхнего уровня для всей системы управления графовой базой данных [neo4j]. В иерархии объектов py2neo GraphService содержит один или несколько объектов Graph, в которых в основном происходит хранение и извлечение данных.

>>> from py2neo import GraphService
>>> gs = GraphService("bolt://camelot.example.com:7687")

# Alternatively, the default value of bolt://localhost:7687 is used:
>>> default_gs = GraphService()
>>> default_gs
<GraphService uri='bolt://localhost:7687'>

class py2neo.Graph(profile=None, name=None, **settings) предоставляет дескриптор отдельной базы данных именованных графов, предоставляемой службой базы данных графов [neo4j]. Сведения о подключении предоставляются с использованием либо URI, либо ConnectionProfile, а также индивидуальных настроек, если это необходимо. Аргумент имени позволяет выбрать базу данных графа по имени. При работе с Neo4j 4.0 и выше это может быть любое имя, указанное в системном каталоге, полный список которого можно получить с помощью команды [cypher] SHOW DATABASES. Если здесь указать None, будет выбрана база данных по умолчанию, определенная на сервере. Для более ранних версий Neo4j имя должно быть установлено на None.

>>> from py2neo import Graph
>>> sales = Graph("bolt+s://g.example.com:7687", name="sales")
>>> sales.run("MATCH (c:Customer) RETURN c.name")
 c.name
---------------
 John Smith
 Amy Pond
 Rory Williams

Доступ к системному графу, доступному во всех выпусках продукта 4.x+, также можно получить через класс SystemGraph.

>>> from py2neo import SystemGraph
>>> sg = SystemGraph("bolt+s://g.example.com:7687")
>>> sg.call("dbms.security.listUsers")
 username | roles | flags
----------|-------|-------
 neo4j    |  null | []

Экземпляр Graph обеспечивает прямой или косвенный доступ к большей части функций, доступных в py2neo.

  • auto новый автокоммит транзакции
  • begin открыть новую транзакцию
  • call Средство доступа для перечисления и вызова процедур. Это свойство содержит объект procedureLibrary, привязанный к этому графу, который предоставляет ссылки на процедуры Cypher в базовой реализации. Для вызова процедуры требуется только обычный синтаксис вызова функции Python

      >>> g = Graph()
      >>> g.call.dbms.components()
      name         | versions   | edition
      --------------|------------|-----------
      Neo4j Kernel | ['3.5.12'] | community
    
  • commit коммит транзакции
  • create(subgraph)
  • delete(subgraph)
  • delete_all удаляет все ноды и связи
  • evaluate выполняет один запрос Cypher и возвращает значение из первого столбца первой записи.
  • exist
  • match
  • match_one Сопоставить и вернуть одну связь с определенными критериями.
  • merge
  • name имя графа
  • nodes поиск нод по свойствам

      graph = Graph()
      graph.nodes[1234]
      (_1234:Person {name: 'Alice'})
      graph.nodes.get(1234)
      (_1234:Person {name: 'Alice'})
      graph.nodes.match("Person", name="Alice").first()
      (_1234:Person {name: 'Alice'})
    
  • pull(subgraph) получение данных сч реплик
  • push(subgraph)[source]
  • query один ридонли запрос с автокоммитом
  • relationships Это можно использовать для поиска отношений, соответствующих заданным критериям, а также для эффективного подсчета отношений.
  • rollback
  • run один ри/райт запрос с автокоммитом
  • schema схема графа
  • separate(subgraph) удаление отношенийсоответствующих подграфу
  • service сервис, в который входит объект Graph
  • update

Node and relationship matching

Модуль py2neo.matching предоставляет функциональные возможности для сопоставления узлов и отношений в соответствии с определенными критериями. Для каждого типа сущности предусмотрены класс Matcher и класс Match. Сопоставитель можно использовать для выполнения базового выбора, возвращая совпадение, которое само может быть оценено или уточнено.

  • NodeMatcher

      >>> from py2neo import Graph
      >>> from py2neo.matching import *
      >>> g = Graph()
      >>> nodes = NodeMatcher(g)
      >>> keanu = nodes.match("Person", name="Keanu Reeves").first()
      >>> keanu
      Node('Person', born=1964, name='Keanu Reeves')
    
  • NodeMatch
    • iter(match)
    • len(match)
    • all()
    • count()
    • exist()
    • fiest()
    • limit(amount)
    • order_by(fields)
    • skip(amount)
    • where(*predicates, **properties)
  • RelationshipMatcher
  • RelationshipMatch
  • Applying predicates

      >>> nodes.match("Person", name=STARTS_WITH("John")).all()
      [Node('Person', born=1966, name='John Cusack'),
      Node('Person', born=1950, name='John Patrick Stanley'),
      Node('Person', born=1940, name='John Hurt'),
      Node('Person', born=1960, name='John Goodman'),
      Node('Person', born=1965, name='John C. Reilly')]
    
  • Ordering and limiting

Errors

Graph data types

  • Node objects

      >>> from py2neo import Node
      >>> a = Node("Person", name="Alice")
    
  • Relationship objects

      >>> c = Node("Person", name="Carol")
      >>> class WorksWith(Relationship): pass
      >>> ac = WorksWith(a, c)
      >>> type(ac)
      'WORKS_WITH
    
  • Path objects

      >>> from py2neo import Node, Path
      >>> alice, bob, carol = Node(name="Alice"), Node(name="Bob"), Node(name="Carol")
      >>> abc = Path(alice, "KNOWS", bob, Relationship(carol, "KNOWS", bob), carol)
      >>> abc
      <Path order=3 size=2>
      >>> abc.nodes
      (<Node labels=set() properties={'name': 'Alice'}>,
      <Node labels=set() properties={'name': 'Bob'}>,
      <Node labels=set() properties={'name': 'Carol'}>)
      >>> abc.relationships
      (<Relationship type='KNOWS' properties={}>,
      <Relationship type='KNOWS' properties={}>)
      >>> dave, eve = Node(name="Dave"), Node(name="Eve")
      >>> de = Path(dave, "KNOWS", eve)
      >>> de
      <Path order=2 size=1>
      >>> abcde = Path(abc, "KNOWS", de)
      >>> abcde
      <Path order=5 size=4>
      >>> for relationship in abcde.relationships:
      ...     print(relationship)
      ({name:"Alice"})-[:KNOWS]->({name:"Bob"})
      ({name:"Carol"})-[:KNOWS]->({name:"Bob"})
      ({name:"Carol"})-[:KNOWS]->({name:"Dave"})
      ({name:"Dave"})-[:KNOWS]->({name:"Eve"})
    
  • Subgraph objects

      >>> s = ab | ac
      >>> s
      {(alice:Person {name:"Alice"}),
      (bob:Person {name:"Bob"}),
      (carol:Person {name:"Carol"}),
      (Alice)-[:KNOWS]->(Bob),
      (Alice)-[:WORKS_WITH]->(Carol)}
      >>> s.nodes()
      frozenset({(alice:Person {name:"Alice"}),
              (bob:Person {name:"Bob"}),
              (carol:Person {name:"Carol"})})
      >>> s.relationships()
      frozenset({(Alice)-[:KNOWS]->(Bob),
              (Alice)-[:WORKS_WITH]->(Carol)})
    

Geo-spatial data types

Cypher

Cursor objects

Курсор можно рассматривать как окно в базовый поток данных. Все курсоры в py2neo «только вперед», что означает, что навигация начинается до первой записи и может продолжаться только в прямом направлении.

Обычно коду приложения не требуется создавать экземпляр курсора напрямую, поскольку он будет возвращен любым методом выполнения Cypher. Для создания курсора требуется только объект DataSource, который содержит логику доступа к исходным данным, по которым перемещается курсор.

Для многих простых случаев использования курсора требуется только метод forward() и текущий атрибут.

# navigate over all available records
while cursor.forward():
    print(cursor.current["name"])

# get first record
if cursor.forward():
    print(cursor.current["name"])

# or
print(next(cursor)["name"])

# use in a loop (ass iterable)
for record in cursor:
    print(record["name"])

# return first value for queries that return a value
print(cursor.evaluate())

data возвращает весь результат как список словарей

>>> from py2neo import Graph
>>> graph = Graph()
>>> graph.run("MATCH (a:Person) RETURN a.name, a.born LIMIT 4").data()
[{'a.born': 1964, 'a.name': 'Keanu Reeves'},
 {'a.born': 1967, 'a.name': 'Carrie-Anne Moss'},
 {'a.born': 1961, 'a.name': 'Laurence Fishburne'},
 {'a.born': 1960, 'a.name': 'Hugo Weaving'}]

Больше rerurn опции смотри тут

Record objects

Объект Record содержит упорядоченную коллекцию значений с ключами. Он во многом похож на namedtuple, но разрешает доступ к полям только с помощью синтаксиса, заключенного в квадратные скобки, и предоставляет больше функциональных возможностей. Запись расширяет как кортеж, так и отображение.

Running procedures

Utilities

Cypher Lexer

Этот модуль содержит лексер языка Cypher, основанный на платформе лексера Pygments. Это можно использовать для анализа операторов и выражений для варианта Cypher, доступного в Neo4j 3.4.

Cypher Query Generation Functions

Bulk data operations

Этот модуль содержит средства для выполнения операций с большими объемами данных, таких как создание или слияние узлов и связей.

Exporting data

Этот модуль позволяет экспортировать данные во внешние форматы.

>>> from py2neo import Graph
>>> from py2neo.export import to_pandas_data_frame
>>> graph = Graph()
>>> to_pandas_data_frame(graph.run("MATCH (a:Person) RETURN a.name, a.born LIMIT 4"))
   a.born              a.name
0    1964        Keanu Reeves
1    1967    Carrie-Anne Moss
2    1961  Laurence Fishburne
3    1960        Hugo Weaving

Object-Graph Mapping

Пакет py2neo.ogm содержит набор средств для сваинга объектов Python к основному набору даных графа. Определения классов расширяют модель и включают определения свойств и меток, а также сведения о связанных объектах.

class Movie(Model):
    __primarykey__ = "title"

    title = Property()
    tag_line = Property("tagline")
    released = Property()

    actors = RelatedFrom("Person", "ACTED_IN")
    directors = RelatedFrom("Person", "DIRECTED")
    producers = RelatedFrom("Person", "PRODUCED")


class Person(Model):
    __primarykey__ = "name"

    name = Property()
    born = Property()

    acted_in = RelatedTo(Movie)
    directed = RelatedTo(Movie)
    produced = RelatedTo(Movie)

Repositories

Конструктор этого класса имеет такую ​​же сигнатуру, что и конструктор класса Graph.

>>> from py2neo.ogm import Repository
>>> from py2neo.ogm.models.movies import Movie
>>> repo = Repository("bolt://neo4j@localhost:7687", password="password")
>>> repo.match(Movie, "The Matrix").first()
<Movie title='The Matrix'>

Models

В основе структуры py2neo OGM лежит Model. Это базовый класс для всех классов, которые должны отображаться в базе данных графа. Каждая Model содержит узел, а также набор указателей на RelatedObjects и сведения об отношениях, которые их соединяют.

Экземпляр Model может быть создан так же, как и любой другой объект Python, но также может быть сопоставлен с базой данных. Каждый экземпляр может содержать атрибуты, представляющие метки, узлы или связанные объекты.

Properties

Свойство, определенное в модели, предоставляет доступ к свойству определенного моделью узла.

>>> class Person(Model):
...     name = Property()
...
>>> alice = Person()
>>> alice.name = "Alice Smith"
>>> alice.name
"Alice Smith"

Labels

Метка, определенная в модели, предоставляет средство доступа к метке узла. Она отображается как логическое значение, настройка которого позволяет включать или выключать метку.

Метки отображаются в API так же, как логические свойства. Разница между ними заключается в том, как значение преобразуется в базу данных графа. Обычно метку следует использовать, если для этого значения регулярно выполняются сопоставления. Вторичная или вспомогательная информация может храниться в логическом свойстве (bolean propertie).

>>> class Food(Model):
...     hot = Label()
...
>>> pizza = Food()
>>> pizza.hot
False
>>> pizza.hot = True
>>> pizza.hot
True

Связанные объекты — это экземпляры Model, определенным образом связанные с данной Model.

# for (:Person)-[:LIKES]->(:Person)
class Person(Model):
    __primarykey__ = "name"

    name = Property()

    likes = RelatedTo("Person")

Object Matching

Один или несколько экземпляров модели могут быть выбраны из базы данных с помощью метода match соответствующего подкласса.

>>> Person.match(graph, "Keanu Reeves").first()
<Person name='Keanu Reeves'>

>>> list(Person.match(graph).where("_.name =~ 'K.*'"))
[<Person name='Keanu Reeves'>,
 <Person name='Kevin Bacon'>,
 <Person name='Kiefer Sutherland'>,
 <Person name='Kevin Pollak'>,
 <Person name='Kelly McGillis'>,
 <Person name='Kelly Preston'>]

Читай еще: