Ошибка Neo4j при попытке использовать SET = при загрузке csv-файла в python

#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