Добавление нового пользователя в neo4j

Здесь говорит совершенно нуб neo4j,

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

CREATE
(node_1 {FullName:"Peter Parker",FirstName:"peter",FamilyName:"parker"}),
(node_2 {Address:"Newyork",CountryCode:"US"}),
(node_3 {Location:"Hidden"}),
(node_4 {phoneNumber:11111}),
(node_5 {InternetEmailAddress:"[email protected]")

теперь проблема в том,

  1. Каждый раз, когда я выполняю это, я добавляю еще 5 узлов. Я знаю, что мне нужно использовать уникальный ключ, но все примеры, которые я видел, могут использовать уникальный ключ для определенного узла. Итак, как я могу убедиться, что пользователь не будет добавлен, если он уже существует (я могу использовать адрес электронной почты в качестве уникального ключа).
  2. как обновить узлы, если произойдут какие-то изменения. например, через неделю я хочу обновить график, чтобы он содержал следующий вместо предыдущего (без дубликатов)

    CREATE(node_1 {FullName:"Peter Parker",FirstName:"peter",FamilyName:"parker"}),(node_2 {Address:"Newyork",CountryCode:"US"}),(node_3 {Location:"public"}),(node_4 {phoneNumber:11111}),(node_5 {InternetEmailAddress:"[email protected]"),(node_6 {status:"Jailed"})
    

(ПРИМЕЧАНИЕ: новое обновление изменило местоположение на "public" и добавило новый узел для peter< /сильный>


person nafas    schedule 02.10.2014    source источник


Ответы (2)


В любом случае, учитывая, что у вас было много узлов.

Некоторые данные, которые вы смоделировали как узлы, вероятно, являются свойствами, как предполагает другой ответ, некоторые, возможно, правильно смоделированы как узлы, и, вероятно, можно сформировать the или часть отношения.

Общедоступное/скрытое местоположение может быть смоделировано одним из трех способов: как свойство лица, как свойство между лицом и местоположением или как тип отношения. Чтобы понять это, сначала нужно иметь отношения.

Ваш адрес в данный момент — это другой узел, я думаю, это правильно, но, возможно, вы хотели бы иметь два узла, связанных примерно так:

(s:State)-[:IN_COUNTRY]-(c:Country)

YMMV и ясно, что это модель, ориентированная на США, но вы можете легко расширить ее.

Теперь вы можете создать Питера с отношением LIVES_IN:

CREATE (p:Person{fullName:"Peter Parker"}), (s:State{name:"New York"}), (c:Country{code:"US"}),
(p)-[:LIVES_IN]->(s), (s)-[:IN_COUNTRY]->(c)

Для скорости вам лучше смоделировать два отношения, которые могут быть LIVES_IN_PUBLIC и LIVES_IN_HIDDEN, что означает выполнение того обновления, которое вы хотите выше, тогда вам нужно удалить одно и создать другое. Однако, если скорость не имеет существенного значения, обычно также используются свойства отношения.

CREATE (p:Person{fullName:"Peter Parker"}), (s:State{name:"New York"}), (c:Country{code:"US"}),
(p)-[:LIVES_IN{public:false}]->(s), (s)-[:IN_COUNTRY]->(c)

Итак, ваши полные вопросы и ответы:

CREATE (p:Person {fullName:"Peter Parker",firstName:"peter",familyName:"parker", phoneNumber:1111, internetEmailAddress:"[email protected]"}),
(s:State {name:"New York"}), (c:Country {code:"US"}),
(p)-[:LIVES_IN{public:false}]->(s), (s)-[:IN_COUNTRY]-(c)

MATCH (p:Person {internetEmailAddress:"[email protected]"})-[li:LIVES_IN]->()
SET li.public = true, p.status = "jailed"

При добавлении других людей вы, вероятно, не хотите воссоздавать штаты и страны, а хотите сопоставить их и, возможно, Объедините их, но мы остановимся на Создать.

MATCH (s:State{name:"New York"})
CREATE (p:Person{name:"John Smith", internetEmailAddress:"[email protected]"})-[:LIVES_IN{public:false}]->(s)

Джон Смит теперь неявно живет в США, так как вы можете следить за отношениями через State Node.

Трактат завершен.

person JohnMark13    schedule 02.10.2014
comment
Отличный дизайн, Тай. - person nafas; 03.10.2014

Я думаю, что вы неправильно моделируете свои данные здесь - вы настраиваете каждое свойство человека как отдельный узел, что не очень хорошая идея. У вас нет никаких связей между этими узлами, поэтому с этим шаблоном данных позже вы не сможете определить адрес Питера Паркера. Вы также не используете метки узлов, что, я думаю, может здесь действительно помочь.

Быстрый вопрос к вашему ответу об обновлении узлов заключается в том, что вы должны MATCH их, а затем использовать SET для изменения свойства. Итак, если бы у вас был человек, вы могли бы сделать это:

MATCH (p:Person { FullName: "Peter Parker" })
SET p.Address = "123 Fake Street"
RETURN p;

Но заметьте, я делаю предположения о том, как структурированы ваши данные. Я возьму те же данные, которые вы предоставили, это может быть лучший способ их создания:

CREATE (node_1:Person {FullName:"Peter Parker",
                       FirstName:"peter",
                       FamilyName:"parker",
                       Address:"Newyork",CountryCode:"US",
                       Location:"Hidden",
                       phoneNumber:11111,
                       InternetEmailAddress:"[email protected]"});

Разница с этим предложением заключается в том, что я помещаю все свойства в один узел (вместо одного свойства на узел) и применяю к узлу метку Person.

Если вы структурируете данные таким образом, то запрос на обновление, который я предоставил, будет работать. Структурируя данные так, как они у вас есть, невозможно обновить адрес Питера Паркера, потому что между вашими node_1 и node_2 нет никакой связи.

person FrobberOfBits    schedule 02.10.2014
comment
Я согласен, но, может быть, штат/страна может быть использована в качестве примера того, как график может/может/должен функционировать? - person JohnMark13; 02.10.2014
comment
Да, есть куча возможных уточнений, но я не хотел слишком усложнять ответ. Основной вопрос (как делать обновления) очень прост, и, безусловно, со структурой графа можно сделать гораздо больше. Если ОП хочет задать еще один вопрос, мы можем продолжить, но я не хотел отвечать на вопрос, как обновить вопрос, трактатом о графовом моделировании. :) - person FrobberOfBits; 02.10.2014
comment
Я согласен с вами обоими, я так привык к структуре sql, что немного сложно привыкнуть к графикам. ты - person nafas; 03.10.2014