0

私が使用しているモデルのいくつかの擬似コード:

User { int Id, string Username }
Activity { int Id, string Name }
Place { int Id, string Name }

基本的に私にはたくさんのユーザーがいて、それらは特定の場所に属しています(RDBMSの世界では多くの関係があります)。すでにすべてのノードを作成したので、ノード間の関係を作成することです。そのためには、各ノードへの参照を取得して、それらの間の関係を作成する必要があると思います。

注:これまでのところ、関係は存在しません。いくつかの例では、RootNodeを指す関係を持つユーザーノードを追加したように見えますが、理由はわかりません。私はそれをする必要があるかどうかわかりません。

より多くの擬似コード:

var userRef = _graphClient...GetUserNodeWhereIdEquals(user.Id);
// or something like _graphClient.OutV<User>("[[id={0}]]", user.Id)
// or even just _graphClient.V<User>(id == user.Id)
var placeRef = _graphClient...GetPlaceNodeWhereIdEquals(place.Id);

_graphClient...CreateRelationshipBetween(userRef, placeRef, "belongs_to");

残念ながら、ドキュメントはかなり素晴らしいものから始まり、人間関係に到達すると南に向かいます。

2012年3月29日更新

これが私がこれまでに持っているコードです:

        foreach (var a in _activityTasks.GetAll())
        {
            _graphClient.Create(a, new ActivityBelongsTo(_graphClient.RootNode));
        }
        foreach (var p in _placeTasks.GetAll().Take(1))
        {
            var placeNode = _graphClient.Create(p, new PlaceBelongsTo(_graphClient.RootNode));
            foreach (var activity in p.Activities)
            {
                Activity activity1 = activity;
                var activityNode = _graphClient.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == activity1.Id).SingleOrDefault();
                _graphClient.CreateRelationship(placeNode, new PlaceHasActivity(activityNode.Reference));
            }
        }

アクティビティノードは正常に作成されます。プレースノードは正常に作成されます。activityNodeを取得しようとすると、エラーがスローされるようになりました。これはかなり大きなスタックトレースなので、ここで言い換えてみます。

リクエストの実行時に例外を受け取りました。

クエリは次のとおりです。gv(p0).in(p1).filter {it [p2] == p3} .drop(p4).take(p5)._()

例外は次のとおりです。値をnullにすることはできません。パラメータ名:キーSystem.ArgumentNullException:値をnullにすることはできません。パラメータ名:System.Collections.Generic.Dictionary`2.Insert(TKeyキー、TValue値、ブール値の追加)のキー...生の応答本文は次のとおりです:[{ "outgoing_relationships": "http:// localhost:7474 / db / data / node / 2 / ratioships / out"、 "data":{"Name": "Aerobics"、 "Id":2}、 "all_typed_relationships": "http:// localhost:7474 / db / data / node / 2 / ratioships / all / {-list |&| types}"、 "traverse": "http:// localhost:7474 / db / data / node / 2 / traverse / {returnType} "、" self ":" http:// localhost:7474 / db / data / node / 2 "、" property ":" http:// localhost:7474 / db / data / node / 2 /properties / {key} "、

キーがnullのときにディクショナリにアイテムを追加するときに行うこと。問題は、自分の側でデバッグしたときにnullが表示されない、activity1が存在する、RootNodeが存在する、TypeKeyがconst文字列であるということです。

作成したノードを自分で配列またはディクショナリ内に保持してから、NodeReferenceを操作するだけでよいのかどうか疑問に思っています。それが私が次に試みることです。

その朝遅く

これにより、すべてがグラフデータベースに正常に読み込まれるようです。

var activityNodes = _activityTasks.GetAll().ToDictionary(a => a.Id, a => _graphClient.Create(a, new ActivityBelongsTo(_graphClient.RootNode)));

        foreach (var p in _placeTasks.GetAll())
        {
            var placeNode = _graphClient.Create(p, new PlaceBelongsTo(_graphClient.RootNode));
            foreach (var activity in p.Activities)
            {
                _graphClient.CreateRelationship(placeNode, new PlaceHasActivity(activityNodes[activity.Id]));
            }
        }

        foreach (var u in _userTasks.GetAllUserGraph())
        {
            var userNode = _graphClient.Create(u, new UserBelongsTo(_graphClient.RootNode));
            foreach(var activity in u.Activities)
            {
                _graphClient.CreateRelationship(userNode, new UserParticipatesIn(activityNodes[activity.Id]));
            }
        }

今、問題は私が以前持っていたものと似ています。ここで、RootNodeと関係のあるアクティビティを取得したいと思います。

Node<Activity> activity = _graphClient
                            .RootNode
                            .In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == 1)
                            .SingleOrDefault();

キー値をスローしても、null例外になることはありません。グレムリンの構文をもっと調べる必要があると思います。問題はそこにあると思います。

今日の午後

グレムリンクエリの実験を開始しました:

gv(0).inE.filter {it.label=="ACTIVITY_BELONGS_TO"}。outV.filter{it.Id==1}。Name

正常に動作します。私はneo4jClient構文を使用してそれを複製しようとしました:

_graphClient.RootNode.InE(ActivityBelongsTo.TypeKey).OutV(b => b.Id == 1).SingleOrDefault();

同じnull例外、それは吐き出します:

g.v(p0).inE.filter{ it[p1].equals(p2) }.outV.filter{ it[p3] == p4 }.drop(p5).take(p6)._()

終わりを除いて、それは私には正しく見えます。しかしこれを実行しました:

g.v(0).inE.filter{it.label=="ACTIVITY_BELONGS_TO"}.outV.filter{it.Id==1}.drop(0).take(1)._()

そして、それはうまくいきます。ここで何か臭いがあります...デ/シリアル化のサポートが好きでしたが、他のライブラリを試してみる必要があるかもしれません。はぁ...

多分生のクエリが機能すると思いました。いいえ!このメソッドは文字列を受け入れなくなり、必要なGremlinQueryの方法がわかりません。Grooooooooooooooooan。

var users = graphClient.ExecuteGetAllNodesGremlin<IsCustomer>("g.v(0).out('IsCustomer'){it.'Name' == 'BobTheBuilder'}");

2012年3月30日更新

新しいプロジェクトを作成しました。以下のすべてが正常に機能します。なぜここで動作するのか非常に混乱しています...:(バージョンの違いかもしれませんが、私にはわかりません。

        var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
        client.Connect();

        client.Create(new User { Id = 1, Username = "joe" }, new UserBelongsTo(client.RootNode));
        client.Create(new User { Id = 2, Username = "cloe" }, new UserBelongsTo(client.RootNode));
        client.Create(new Activity { Id = 1, Name = "Bocce Ball" }, new ActivityBelongsTo(client.RootNode));
        client.Create(new Activity { Id = 2, Name = "Programming" }, new ActivityBelongsTo(client.RootNode));

        var user = client.RootNode.In<User>(UserBelongsTo.TypeKey, u=>u.Id == 1).SingleOrDefault();
        var activity = client.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a=>a.Id == 1).SingleOrDefault();
        client.CreateRelationship(user.Reference, new Plays(activity.Reference));

        user = client.RootNode.In<User>(UserBelongsTo.TypeKey, u => u.Id == 1).SingleOrDefault();
        activity = client.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == 1).SingleOrDefault();
4

1 に答える 1

1

私も始めたばかりです。このブログをチェックすることをお勧めします:http: //romikoderbynew.com/2011/07/30/neo4jclient-primer/

また、その他の例については、 http://frictionfree.orgとそのソースコード(aboutセクション)を確認してください。

  • 既存の関係を作成する-私が理解しているように、これは可能です。ただし、ノードを作成するときにノードを関連付ける方が簡単なようです。ブログから:

既存のノード間に関係を作成することもできます。graphClient.CreateRelationship(customerNodeReference、new Speaks(languageNode.Reference));

  • RootNode-ノードからクエリを開始する必要があると思いますが、実行できるとは思いません

    SELECT * FROM ... WHERE
    

    したがって、ノードをルートノードに接続する必要があることは理にかなっています。これはFrictionFreeAppの例です。

    var node = graphClient.Create(
            user,
            new UserBelongsTo(rootNode));
    
于 2012-03-29T10:23:43.980 に答える