0

Neo4j 2.0 M06 では、CREATE UNIQUE が減価償却され、代わりに MERGE と MATCH に置き換えられたことを理解していますが、これを使用して一意のパスを作成する方法を理解するのは難しいと感じています。

例として、私は

MERGE root-[:HAS_CALENDER]->(cal:Calender{name:'Booking'})-[:HAS_YEAR]->(year:Year{value:2013})-[:HAS_MONTH]-(month:Month{value:'January'})-[:HAS_DAY]->(day:Day{value:1})
ON CREATE cal
SET cal.created = timestamp()
ON CREATE year
SET year.created = timestamp()
ON CREATE month
SET month.created = timestamp()
ON CREATE day
SET day.created = timestamp()

カレンダーに新しい日を追加しようとすると、年のみが作成され、存在しない月は既存のパスに追加されるだけです。クエリを実行すると、STATEMENT_EXECUTION_ERROR が返されます

MERGE only supports single node patterns

これを達成するために、ここで複数のステートメントを実行する必要があります。問題は、Neo4j でこのようなケースを処理するための最良の方法は何ですか?

編集

アプローチを少し変更しましたが、複数の呼び出しを行った後でも、マージはラベル レベルで行われており、提供する開始ノードに制限しようとはしていないと思います。その結果、何年にもわたって共有されるノードになってしまいますそして、私が期待していたものではない月

ここに画像の説明を入力

以下のような適切なグラフを取得する方法を誰かが提案してくれれば、本当に感謝しています

ここに画像の説明を入力

私のC#コードは次のようなものです:

var qry = GraphClient.Cypher
            .Merge("(cal:CalendarType{ Name: {calName}})")
            .OnCreate("cal").Set("cal = {newCal}")
            .With("cal")
            .Start(new { root = GraphClient.RootNode})
            .CreateUnique("(root)-[:HAS_CALENDAR]->(cal)")
            .WithParams(new { calName = newCalender.Name, newCal = newCalender })
            .Return(cal => cal.Node<CalenderType>());
        var calNode = qry.Results.Single();


        var newYear = new Year { Name = date.Year.ToString(), Value = date.Year }.RunEntityHousekeeping();

        var qryYr = GraphClient.Cypher
            .Merge("(year:Year{ Value: {yr}})")
            .OnCreate("year").Set("year = {newYear}")
            .With("year")
            .Start(new { calNode })
            .CreateUnique("(calNode)-[:HAS_YEAR]->(year)")
            .WithParams(new { yr = newYear.Value, newYear = newYear })
            .Return(year => year.Node<Year>());
        var yearNode = qryYr.Results.Single();


        var newMonth = new Month { Name = date.Month.ToString(), Value = date.Month }.RunEntityHousekeeping();
        var qryMonth = GraphClient.Cypher
            .Merge("(mon:Month{ Value: {mnVal}})")
            .OnCreate("mon").Set("mon = {newMonth}")
            .With("mon")
            .Start(new { yearNode })
            .CreateUnique("(yearNode)-[:HAS_MONTH]->(mon)")
            .WithParams(new { mnVal = newMonth.Value, newMonth = newMonth })
            .Return(mon => mon.Node<Month>());
        var monthNode = qryMonth.Results.Single();


        var newDay = new Day { Name = date.Day.ToString(), Value = date.Day, Date = date.Date }.RunEntityHousekeeping();
        var qryDay = GraphClient.Cypher
            .Merge("(day:Day{ Value: {mnVal}})")
            .OnCreate("day").Set("day = {newDay}")
            .With("day")
            .Start(new { monthNode })
            .CreateUnique("(monthNode)-[:HAS_DAY]->(day)")
            .WithParams(new { mnVal = newDay.Value, newDay = newDay })
            .Return(day => day.Node<Day>());
        var dayNode = qryDay.Results.Single();

よろしくキラン

4

3 に答える 3

2

ドキュメントページのどこにも、CREATE UNIQUE廃止されたとは書かれていません。

MERGEあなたが利用できる新しいアプローチです。これにより、いくつかの新しいシナリオ (ラベルに基づくマッチング、ON CREATEおよびON MATCHトリガー) が可能になりますが、より複雑なシナリオ (複数のノード) はカバーされません。

については、すでにおなじみのようですねCREATE UNIQUE。今のところ、まだそれを使用する必要があると思います。

于 2013-11-04T04:31:47.203 に答える