2017-01-24 5 views
0

У меня есть следующий код:Neo4j добавить уникальное значение для массива недвижимости

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 
'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1 
MERGE (p:Person {forename:line1.forename, surname:line1.surname}) 
ON CREATE SET p.compNumber = 
CASE 
WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber 
WHEN EXISTS(p.compNumber) AND line1.CompanyNumber NOT IN p.compNumber THEN p.compNumber + line1.CompanyNumber 
ELSE p.compNumber 
END 
ON MATCH SET p.compNumber = 
CASE 
WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber 
WHEN EXISTS(p.compNumber) AND line1.CompanyNumber NOT IN p.compNumber THEN p.compNumber + line1.CompanyNumber 
ELSE p.compNumber 
END 

То, что я пытаюсь сделать, это добавить compNumber свойства массива в Person узлов. Итак, я проверяю, существует ли свойство compNumber в узле, и если новое значение, которое нужно добавить, еще не находится в этом свойстве. Если свойство не существует, оно создает его с желаемым значением, и если оно существует, а значение не находится в массиве, то значение добавляется к массиву.

Этот запрос вызывает ошибку. Кто-нибудь знает, что я делаю неправильно здесь, и есть ли более красивое решение моей проблемы?

+0

Есть ли причина, по которой вы не можете использовать: Компания или: узел CompanyNumber, подключенный к: Лицу вместо хранения в массиве объекта: Person? Это также будет полезно, если вам нужно искать: Лица по номеру компании позже. – InverseFalcon

+0

То, что у меня есть сейчас: компания с узлами, которые имеют свойство 'companyNumber', и подумали о добавлении свойства' compNumber' в: Person и затем сопоставлении их по числу. Вы предлагаете удалить свойство 'companyNumber' из: Company и создать новый узел с свойством' companyNumber' как свойство, а затем подключить узлы ': Person' и': Company' к этому узлу, как этот '(: Person) -> [: HAS_NUMBER] -> (: CompanyNumber) <- [: HAS_NUMBER] - (: Компания) '? – Porjaz

+0

Нет, это кажется немного чрезмерным. Если у вас уже есть: узлы компании с свойством companyNumber (я предполагаю, что существует уникальное ограничение на: Company (companyNumber)), тогда нет причин, по которым вы создаете отношения между: Лица и: Компании с данным номером компании вместо хранения компанииNumber в массив. Это почти похоже на то, что вы пришли из реляционной базы данных с внешними ключами между таблицами. В Neo4j внешние ключи, как правило, не используются, предпочтительны отношения между узлами. – InverseFalcon

ответ

1

Как упоминалось в моих предыдущих комментариях, это звучит, как вы пытаетесь установить внешнюю ключи между: Лица и: Компании. В базах данных графов внешние ключи, как правило, не используются, поскольку концепция взаимосвязи между узлами заменяет их.

Я бы порекомендовал отказаться от подхода к хранению companyNumbers в массивах на узлах Person и вместо этого во время обработки найти: узел компании с этим номером company (если он существует) и создать связь между: Person и: Компания.

Предположим, что существует уникальное ограничение на: Company (companyNumber).

Модифицированный запрос может выглядеть следующим образом:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 
'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1 
MERGE (p:Person {forename:line1.forename, surname:line1.surname}) 
MERGE (c:Company {companyNumber:line1.CompanyNumber}) 
MERGE (p)-[:WorksFor]->(c) 

Вы хотите изменить: WorksFor к тому, что тип отношения имеет больше смысла, так как вы никогда не обеспечили контекст отношений между: Лица и : Узлы компании.

+0

Это работает хорошо. Большое спасибо :) – Porjaz

0

Неправильный синтаксис line1.CompanyNumber NOT IN p.compNumber. Он должен быть NOT line1.CompanyNumber IN p.compNumber.

Кроме того, ON CREATE случай может быть значительно упрощена, так как мы знаем, в этом случае, p.comNumber не существует:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1 
MERGE (p:Person {forename:line1.forename, surname:line1.surname}) 
ON CREATE SET p.compNumber = line1.CompanyNumber 
ON MATCH SET p.compNumber = 
    CASE WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber 
     WHEN EXISTS(p.compNumber) AND NOT line1.CompanyNumber IN p.compNumber THEN p.compNumber + line1.CompanyNumber 
     ELSE p.compNumber END