Рекомендация статьи "Хорошая вещь": Интеллектуальный анализ больших данных на практике - PyODPSОсновные операции
Адрес статьи:https://cloud.tencent.com/developer/article/2470521
Причина рекомендации: многие сторонние платформы имеют свои собственные инструменты для работы с большими данными и библиотеки инструментов для кода. Поэтому в этой серии материалов в основном рассказывается о PyODPS, которая в настоящее время является основной и широко используемой библиотекой PySpark для работы с большими данными. Она в основном опирается на Alibaba Cloud. DataWorks и может быть непосредственно использован при разработке больших данных. MaxCompute использует PyODPS, что очень удобно для интеллектуального анализа данных. Таким образом, эта серия расширит возможности MaxComputer для выполнения ряда проектов по интеллектуальному анализу данных. Не пропустите, если вам это нужно.
На данный момент проект продвинулся до пятого шага, который близок к нашей конечной цели — автоматизации. Производство знаний не за горами. Следуя содержанию предыдущей главы, наш контент в этой главе требует подключения Python для работы Neo4j для достижения полной интеграции процессов. Уже существуют относительно зрелые методы, и наш предыдущий контент был завершен, включая использование Neo4j и использование данных. операции, поэтому мы хорошо понимаем, как использовать Neo4j через Python, поэтому давайте начнем сейчас, без лишних слов. в График Заинтересованные студенты не должны пропустить мою колонку о создании проекта с нуля.
Необходимо обратить внимание на среду Python, для которой требуется Python >= 3.7
pip install neo4j
После установки драйвера и запуска экземпляра Neo4j,Пришло время добавить приложение в базу данных. Создав объект Driver и предоставив URL-адрес и токен аутентификации.,Может подключаться к базе данных.
from neo4j import GraphDatabase
# URI examples: "neo4j://localhost", "neo4j+s://xxx.databases.neo4j.io"
URI = "<URI for Neo4j database>"
AUTH = ("<Username>", "<Password>")
with GraphDatabase.driver(URI, auth=AUTH) as driver:
driver.verify_connectivity()
print("Connection established.")
Создание экземпляра драйвера предоставляет только информацию о том, как получить доступ к базе данных.,Но единство фактически не было установлено. соединение откладывается до исполнения первого Запроса.,Чтобы немедленно убедиться, что драйвер может подключаться к базе данных (действительные учетные данные, совместимая версия и т. д.),Необходимо использовать метод .verify_connectivity() после инициализации драйвера.
Как создание объекта Driver, так и его проверка вызывают ряд различных исключений. Из-за Обработки ошибок Может быть очень многословным,И ошибка соединения будет мешать выполнению последующих задач.,Поэтому наиболее распространенным вариантом является аварийное завершение программы при возникновении исключения во время процесса.
Объекты драйвера неизменяемы и потокобезопасны.,И стоимость создания высока,Таким образом, приложения должны создавать только один экземпляр и передавать его (экземпляры драйвера могут использоваться несколькими потоками). Если вам нужно передать базу данных Запрос нескольким разным пользователям,Запрос может быть выполнен в контексте безопасности другого пользователя.,и использовать параметрыpseudomateduserУкажите имя пользователя, которого вы хотите олицетворять.。с этой целью,Пользователь, создающий драйвер, должен иметь соответствующие разрешения. Лучше олицетворять пользователя, чем создавать новый объект Driver.
driver.execute_query(
"MATCH (p:Person) RETURN p.name",
impersonated_user_="somebody_else",
database_="neo4j",
)
, без создания нового экземпляра драйвера. Если вы хотите изменить конфигурацию драйвера, вам необходимо создать новый объект.
Закройте объект Driver, чтобы освободить все выделенные ресурсы.,Это справедливо даже в случае сбоя подключения или ошибки во время выполнения. Создайте экземпляр объекта Driver с помощью оператора with.,Или вызовите метод Driver.close() явно.
driver.close()
После подключения к базе данных,Запрос можно запустить с помощью Cypher и метода Driver.execute_query(). Driver.execut_query() появился в версии драйвера 5.8. Для более ранних версий Запроса,Нужно использоватьsessions and transactions.。
Чтобы создать узел, представляющий человека по имени Алиса, вы можете использовать предложение Cypher create:
summary = driver.execute_query(
"CREATE (:Person {name: $name})",
name="Alice",
database_="neo4j",
).summary
print("Created {nodes_created} nodes in {time} ms.".format(
nodes_created=summary.counters.nodes_created,
time=summary.result_available_after
))
Когда мы снова входим в Cypher, мы видим:
MATCH (tom:Person)
WHERE tom.name = "Alice"
RETURN tom
Чтобы получить информацию из базы данных, передайте ее Neo4j, как в предложении Cypher MATCH выше:
records, summary, keys = driver.execute_query(
"MATCH (tom:Person)\
WHERE tom.name = 'Alice'\
RETURN tom",
database_="neo4j",
)
# Loop through results and do something with them
for record in records:
print(record.data()) # obtain record as dict
# Summary information
print("The query `{query}` returned {records_count} records in {time} ms.".format(
query=summary.query, records_count=len(records),
time=summary.result_available_after
))
Records содержит результаты в виде массива объектов Record, а summary содержит сводку выполнения, возвращаемую сервером.
Чтобы восстановить информацию об узлах в базе данных, вы можете использовать предложения Cypher MATCH и SET:
records, summary, keys = driver.execute_query("""
MATCH (p:Person {name: $name})
SET p.age = $age
""", name="Alice", age=42,
database_="neo4j",
)
print(f"Query counters: {summary.counters}.")
records, summary, keys = driver.execute_query( "MATCH (people:Person)\ WHERE people.name = 'Alice'\ RETURN people.age", database_="neo4j",)
Чтобы создать новую связь, связывающую его с двумя существующими узлами, вы можете использовать комбинацию предложений Cypher MATCH и create:
records, summary, keys = driver.execute_query("""
MATCH (alice:Person {name: $name})
MATCH (bob:Person {name: $friend})
CREATE (alice)-[:KNOWS]->(bob)
""", name="Alice", friend="Bob",
database_="neo4j",
)
print(f"Query counters: {summary.counters}.")
Если Боба нет, вы можете сначала создать этот узел:
summary = driver.execute_query(
"CREATE (:Person {name: $name})",
name="Bob",
database_="neo4j",
).summary
print("Created {nodes_created} nodes in {time} ms.".format(
nodes_created=summary.counters.nodes_created,
time=summary.result_available_after
))
После выполнения вышеуказанной связи вставки на дисплее выводится:
Вставка прошла успешно.
Чтобы получить узел удаления и все связанные с ним отношения, вам нужно использовать предложение Cypher DETACH DELETE:
records, summary, keys = driver.execute_query("""
MATCH (p:Person {name: $name})
DETACH DELETE p
""", name="Bob",
database_="neo4j",
)
print(f"Query counters: {summary.counters}.")
Запрос При написании кода не делайте жесткого кода и не подключайтесь непосредственно к Запросу. Напротив,Пожалуйста, всегда используйте заполнители и указывайте параметры Cypher.,Как показано в предыдущем примере. Это для:
Запрос параметры могут передаваться как несколько аргументов ключевого слова,Также могут быть сгруппированы в словаре как значения для аргументов options_keyword. В случае смешанного,Аргументы ключевого слова имеют приоритет над аргументами словаря.
parameters = {
"name": "Alice",
"age": 42
}
driver.execute_query(
"MERGE (charlie {name: $name, age: $age})\
RETURN charlie",
parameters_=parameters,
database_="neo4j",
)
Поскольку .execut_query() может генерировать множество различных исключений, лучший способ обработки ошибок — перехватить их все в одном блоке try/Exception:
try:
driver.execute_query(...)
except Exception as e:
... # handle exception
Если сбой считается временным (например, из-за отсутствия временной Служить),Драйвер автоматически повторит неудачный запуск Запроса. Если операция по-прежнему не удалась после нескольких попыток,выдаст исключение.
Для изменения могут быть предоставлены дополнительные аргументы ключевого слова..executПоведение query() по умолчанию, суффикс параметра конфигурации:。
Рекомендуется явно указывать базу данных с помощью параметра data_, даже для одного экземпляра базы данных. Это позволяет драйверу работать более эффективно, поскольку экономит время передачи данных по сети серверу для анализа локальной базы данных. Если база данных не указана, используется домашняя база данных пользователя.
driver.execute_query(
"MATCH (p:Person) RETURN p.name",
database_="neo4j",
)
В кластерной среде,По умолчанию,Все сообщения будут направляться узлу-лидеру. Для улучшения показателей чтения Запрос,Запрос можно направить на узел чтения, используя параметр router_="r".
driver.execute_query(
"MATCH (p:Person) RETURN p.name",
routing_="r", # short for neo4j.RoutingControl.READ
database_="neo4j",
)
При выполнении записи Запроса в режиме чтения может возникнуть ошибка выполнения.,Но на это не следует полагаться при контроле доступа. Разница между этими двумя режимами заключается в том, что,Транзакции чтения будут направляться на любой узел кластера.,И транзакции записи будут направлены лидеру. другими словами,Нет никакой гарантии, что записи в Запросы, отправленные в режиме чтения, будут отклонены.
Мы также Запрос может быть выполнен в контексте безопасности другого пользователя.,Использовать параметрыpseudomateduserУкажите имя пользователя, которого вы хотите олицетворять.。с этой целью Пользователь, создающий драйвер, должен иметь соответствующие разрешения.。Создание нового не требуется и не рекомендуется.Driverобъект。
driver.execute_query(
"MATCH (p:Person) RETURN p.name",
impersonated_user_="somebody_else",
database_="neo4j",
)
При выдаче себя за пользователя,Запрос выполняется в полном контексте безопасности олицетворяющего пользователя.,Вместо запуска от имени аутентифицированного пользователя (т. е. основной базы данных, разрешений и т. д.).
Можно использоватьresulttransformerПараметры будут Запрос Результаты преобразуются в различные структуры данных.。Драйвер предоставляет способ преобразования результата вpandas Встроенные методы для Dataframe или Graph, также можно создать собственный конвертер.
Затем мы объединим вышеизложенное, чтобы использовать полный пример создания диаграммы:
from neo4j import GraphDatabase
URI = "bolt://localhost:7687"
AUTH = ("neo4j", "xwt353008")
people = [{"name": "Alice", "age": 42, "friends": ["Bob", "Peter", "Anna"]},
{"name": "Bob", "age": 19},
{"name": "Peter", "age": 50},
{"name": "Anna", "age": 30}]
with GraphDatabase.driver(URI, auth=AUTH) as driver:
try:
# Create some nodes
for person in people:
records, summary, keys = driver.execute_query(
"MERGE (p:Person {name: $person.name, age: $person.age})",
person=person,
database_="neo4j",
)
# Create some relationships
for person in people:
if person.get("friends"):
records, summary, keys = driver.execute_query("""
MATCH (p:Person {name: $person.name})
UNWIND $person.friends AS friend_name
MATCH (friend:Person {name: friend_name})
MERGE (p)-[:KNOWS]->(friend)
""", person=person,
database_="neo4j",
)
# Retrieve Alice's friends who are under 40
records, summary, keys = driver.execute_query("""
MATCH (p:Person {name: $name})-[:KNOWS]-(friend:Person)
WHERE friend.age < $age
RETURN friend
""", name="Alice", age=40,
routing_="r",
database_="neo4j",
)
# Loop through results and do something with them
for record in records:
print(record)
# Summary information
print("The query `{query}` returned {records_count} records in {time} ms.".format(
query=summary.query, records_count=len(records),
time=summary.result_available_after
))
except Exception as e:
print(e)
# further logging/processing
Итак, это конец этой главы, это, по сути, основы pythonсоединятьNeo4j. операции,Легче понять и кодировать,В следующей главе я буду использовать бизнес-данные для фактического выполнения операций по проектированию.,Завершите получение данных от компании, а затем преобразуйте их в базу данных.,Затем перейдите по ссылке на отображение визуализации данных.,Заинтересованные студенты не должны пропустить это.