Как создать уникальный путь внутри подграфа с помощью Neo4J

Это своего рода расширение моего предыдущего вопроса, на который я еще не получил ответов, который опубликован здесь

Я пытаюсь понять, как создать график, как показано ниже введите здесь описание изображения

Но вместо этого я получаю

введите здесь описание изображения

Проблема в том, что все примеры MERGE, которые я вижу, основаны на метке, и, поскольку метка является универсальной, она в конечном итоге собирает склады грузоотправителя 1 при создании грузоотправителя 2, поскольку они имеют одинаковые имена. Такая же проблема у меня с датой и месяцем в предыдущем посте.

мой код в Neo4JClient будет выглядеть примерно так (здесь пример, напечатанный вручную)

var qry = GraphClient.Cypher
                .Merge("(whse:Warehouse{ Name: {whseName}})")
                .OnCreate("whse").Set("whse= {newWhseData}")
                .With("whse")
                .Start(new { root = shipper2Node})
                .CreateUnique("(root)-[:HAS_WAREHOUSE]->(whse)")
                .WithParams(new { whseName = newWhse.Name, newWhseData= newWhse})
                .Return(whse => whse.Node<Warehouse>());
 var whseNode = qry.Results.Single();

Мне действительно нужно убедиться, что я не создаю дубликаты складов для одного и того же грузоотправителя, и, следовательно, использование Merge в моем коде. Я понимаю, что Merge and Match заменяет Create Unique в 2.0.

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

Заранее спасибо, Киран


person Kiran    schedule 02.11.2013    source источник


Ответы (1)


Вы бы использовали create-unique для подграфа, но вы правильно заметили, что мы должны принять это во внимание при разработке MERGE для работы с путями.

Что-то вроде:

var qry = GraphClient.Cypher
            .Start(new { root = shipper2Node})
            .CreateUnique("(root)-[:HAS_WAREHOUSE]->(whse Name: {whseName})")
            .Set("whse= {newWhseData}")
            .WithParams(new { whseName = newWhse.Name, newWhseData= newWhse})
            .Return(whse => whse.Node<Warehouse>());
person Michael Hunger    schedule 03.11.2013
comment
Как это будет работать, будет ли он всегда перезаписывать whse на newWhseData каждый раз при выполнении запроса? или он будет использовать команду set только при создании нового узла. - person Kiran; 04.11.2013
comment
@Kiran Это будет обновлять свойство каждый раз. Если shipper2Node уже существует, вы можете продолжать использовать Merge, если попытаетесь создать составной идентификатор для идентификации хранилища, используя имя хранилища и идентификатор shipper2Node. - person LameCoder; 05.11.2013