#neo4j #cypher
Вопрос:
Поэтому я загружаю csv-файл в Neo4j с помощью python. Мой загрузочный код выглядит так:
from neo4j import GraphDatabase
driver = GraphDatabase.driver("connection", auth=("name", "password"))
def add_data(tx):
tx.run("LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Damian/PycharmProjects/NeoJ/DataMap.csv' AS Map
MERGE (source {node_name: Map.source})
MERGE (destination {node_name: Map.destination})
MERGE (source)-[:FEEDS_INTO]->(destination)")
def add_other(tx):
tx.run("LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Damian/PycharmProjects/NeoJ/Data.csv' AS Data
Match (n {node_name: Data.dane})
MERGE (system {system_name: Data.system})
MERGE (scope {scope_name: Data.scope})
MERGE (process {process_name: Data.process})
MERGE (owner {owner_name: Data.owner})
MERGE (n)-[:UNDER_SYSTEM]->(system)
MERGE (system)-[:UNDER_SCOPE]->(scope)
MERGE (n)-[:HAS_PROCESS]->(process)
MERGE (owner)-[:IS_OWNER_OF]->(n) ")
def add_data_properties(tx):
tx.run("LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Damian/PycharmProjects/NeoJ/Data.csv' AS Data
MATCH (n {node_name: Data.dane })
SET n.system = Data.system
SET n.scope = Data.scope
SET n.process = Data.process
SET n.owner = Data.owner")
with driver.session() as session:
session.write_transaction(add_data)
session.write_transaction(add_other)
session.write_transaction(add_data_properties)
driver.close()
Ошибка, которую я получаю, такова:
neo4j.exceptions.CypherSyntaxError: {code: Neo.ClientError.Statement.SyntaxError} {message: Invalid input ' ': expected whitespace, comment, '(', '.' or '=' (line 1, column 147 (offset: 146))
"LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Damian/PycharmProjects/NeoJ/Data.csv' AS Data MATCH (n {node_name: Data.dane }) SET n.system = Data.system SET n.scope = Data.scope SET n.process = Data.process SET n.owner = Data.owner" ^}
Но когда я использую, например, НАБОР n.system = Data.system, все в порядке.
У кого-нибудь есть идеи, как это исправить ?
Любая помощь будет очень признательна.
Ответ №1:
Похоже, вы уже нашли и исправили ошибку. Если вы хотите установить свойство system
на узле n
, то вы хотите сделать
SET n.system = Data.system
если вы хотите обновить узел n
с помощью карты, содержащейся в Data.system
, то вы хотите сделать
SET n = Data.system
Комментарии:
1. ОК. Я думал, что = не только обновляет, но и добавляет, если свойство не существует. Так что, если эта проблема разрешилась сама собой, у меня есть еще один маленький вопрос. Вы знаете, почему Neo4J Bloom не показывает мне свойства узлов ? Когда я нажимаю на узел, я получаю «У этого узла нет свойств», когда в браузере Neo4J все работает нормально, и у каждого узла есть свойства. Нужно ли мне использовать метки вместо свойств ?
2. Понятия не имею, извини. Я рекомендую задать новый вопрос здесь на SO или на Neo4j discord по адресу discord.com/channels/787399249741479977/787399744955088897