私が使用しているモデルのいくつかの擬似コード:
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();