Обновление атрибутов узла на основе новых узлов - PullRequest
0 голосов
/ 12 июня 2019

У меня есть такие ребра:

(People)-[:USE]->(Product)
(People)-[:REVIEW]->(Product)

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

Я хочу сделать что-то вроде:

LOAD CSV WITH HEADERS FROM "file:///abcd.csv" AS row 
MERGE (svc:Consumer {name: row.referring_name})
ON CREATE SET
    svc.skewNum = toInteger(row.skew_num)
MERGE (p:PrimaryConsumer) WHERE p.name = svc.name
ON MATCH SET
    svc.city = p.city,
    svc.latitude = toFloat(p.latitude),
    svc.longitude = toFloat(p.longitude),
    svc.consumerId = toInteger(p.primaryConsumerId)

Какие борки:

Neo.ClientError.Statement.SyntaxError: Неверный ввод 'H': ожидаемое 'i / I' (строка 10, столбец 28 (смещение: 346)) "MERGE (p: PrimaryConsumer), ГДЕ p.name = svc.name"

Я на 100% уверен, что имена уникальны и будут соответствовать уникальному имени потребителя в существующем наборе узлов (будет видно).

Как бы я добавил существующие атрибуты к новым данным, когда у меня есть совпадение по уникальным атрибутам узла? (Я надеюсь получить уникальные идентификаторы, но я должен иметь возможность выполнить обновление новых данных на совпадение)

Спасибо.

Это весь скрипт cypher - модифицированный согласно вводу @ cypher.

 USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM "file:///abcde.csv" AS row
    MERGE (svc:Consumer {name: row.referring_name})
    ON CREATE SET
        svc.skeyNum = toInteger(row.skew_num)
        MATCH (p:primaryConsumer {name: svc:name})
    ON MATCH SET
        svc.city = p.city,
        svc.latitude = toFloat(p.latitude),
        svc.longitude = toFloat(p.longitude),
        svc.providerId = toInteger(p.providerId)
    MERGE (spec:Product {name: row.svc_prod_name})
    ON CREATE SET
        spec.name = row.svc_prov_name,
        spec.skew = toInteger(row.skew_id),
        spec.city = row.svc_prov_city,
        spec.totalAllowed = toFloat(row.total_allowed)
    MERGE (svc)-[r:CONFIRMED_PURCHASE]->(spec)
    ON MATCH SET r.totalAllowed = r.totalAllowed + spec.totalAllowed
    ON CREATE SET r.totalAllowed = spec.totalAllowed
;

1 Ответ

2 голосов
/ 12 июня 2019

MERGE не принимает предложение WHERE.

Изменить это:

MERGE (p:PrimaryConsumer) WHERE p.name = svc.name

к этому:

MERGE (p:PrimaryConsumer {name: svc.name})

[РЕДАКТИРОВАТЬ]

Тогда весь ваш запрос должен выглядеть так:

LOAD CSV WITH HEADERS FROM "file:///abcd.csv" AS row 
MERGE (svc:Consumer {name: row.referring_name})
ON CREATE SET
    svc.skewNum = toInteger(row.skew_num)
MERGE (p:PrimaryConsumer {name: svc.name})
ON MATCH SET
    svc.city = p.city,
    svc.latitude = toFloat(p.latitude),
    svc.longitude = toFloat(p.longitude),
    svc.consumerId = toInteger(p.primaryConsumerId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...