pytoneo client library and toolkit for working with neo4j
Теги: data-bases graphs python
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
сервис, в который входит объект Graphupdate
Node and relationship matching
Модуль py2neo.matching предоставляет функциональные возможности для сопоставления узлов и отношений в соответствии с определенными критериями. Для каждого типа сущности предусмотрены класс Matcher и класс Match. Сопоставитель можно использовать для выполнения базового выбора, возвращая совпадение, которое само может быть оценено или уточнено.
-
>>> 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
-
>>> 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
-
>>> from py2neo import Node >>> a = Node("Person", name="Alice")
-
>>> c = Node("Person", name="Carol") >>> class WorksWith(Relationship): pass >>> ac = WorksWith(a, c) >>> type(ac) 'WORKS_WITH
-
>>> 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"})
-
>>> 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
Related Objects
Связанные объекты — это экземпляры 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'>]
Читай еще: