Некоторые псевдо-код модели я работаю с:Как я могу получить конкретный узел Neo4j с помощью Neo4jClient
User { int Id, string Username }
Activity { int Id, string Name }
Place { int Id, string Name }
В принципе у меня есть куча пользователей, и они принадлежат к определенным местам (многие ко многим отношения в мире РСУБД). То, что я хотел бы сделать теперь, когда я создал все узлы, уже создает связь между ними. Для этого я считаю, что мне нужно получить ссылки на каждый узел, а затем просто создать связь между ними.
Примечание: До сих пор никаких отношений не существует. Это похоже на некоторые из примеров, в которые они добавили пользовательские узлы с отношением, указывающим на 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");
К сожалению, документация начинается довольно велика, то идет на юг, когда вы к отношениям.
Update 3/29/12
Вот код, который я до сих пор:
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 возникает ошибка. Это довольно большая трассировка стека, поэтому я попытаюсь перефразировать здесь:
Получено исключение при выполнении запроса.
Запрос был: ГВ (р0) .в (р1) .filter {это [р2] == р3 } .drop (р4) .Снять (P5) ._()
Исключением был : Значение не может быть нулевым. Имя параметра: key System.ArgumentNullException: значение не может быть null.Parameter name: key at System.Collections.Generic.Dictionary`2.Insert (ключ TKey, значение TValue , логическое добавление) ... Тело сырой реакции было : [{ "outgoing_relationships": "http: // localhost: 7474/db/data/node/2/relationship/out", "data": { "Name": "Aerobics", "Id": 2 }, "all_typed_relationships": "http: // localhost: 7474/db/data/node/2/relationship/all/{-list | & | types}", "traverse": "http: // localhost : 7474/db/data/node/2/traverse/{returnType} "," self " :" http: // localhost: 7474/db/data/node/2 "," property ": " http:// локальный: 7474/дб/данные/кивок e/2/properties/{key} ", " outgoing_typed_relationships ": " http: // localhost: 7474/db/data/node/2/relationship/out/{-list | & | types} ", " properties ":" http: // localhost: 7474/db/data/node/2/properties ", " incoming_relationships ": " http: // localhost: 7474/db/data/узел/2/отношения/в "," расширения " : {}," create_relationship ": " http: // localhost: 7474/db/data/node/2/relationship ", " paged_traverse ": " http : // локальный: 7474/дБ/данных/узел/2/выгружаемого/траверса/{} {ReturnType?pageSize, leaseTime} ", " all_relationships ": " http: // localhost: 7474/db/data/node/2/relationship/all ", " incoming_typed_relationships ": " http: // localhost: 7474/db/данные/узел/2/отношения/в/{- список | & |.} Типы» }]
Что делать при добавлении элемента в словарь, если ключ является недействительным Проблема, я не вижу каких-либо аннулирует, когда я отладки на моем конце, activity1 есть , RootNode есть, TypeKey является константной строкой.
Мне почти интересно, следует ли мне просто создавать созданные узлы внутри массива или словаря самостоятельно, а затем просто работать с 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();
Бросив значение ключа не может быть пустым исключение снова. Я думаю, мне нужно больше изучить синтаксис гремлина. Я предполагаю, что проблема есть.
Этим днем
начал экспериментировать с Gremlin запросов:.
Gv (0) .inE.filter {it.label == "ACTIVITY_BELONGS_TO"} outV.filter {it.Id = = 1}. Имя
работает нормально. Я попытался реплицировать это, используя синтаксис neo4jClient:
_graphClient.RootNode.InE (ActivityBelongsTo.TypeKey) .OutV (b => b.Id == 1) .SingleOrDefault();
же нулевое исключение, он выплевывает:
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)._()
И это прекрасно работает. Что-то воняет здесь ... может быть, я должен попробовать другую библиотеку, хотя мне понравилась поддержка де-сериализации. Sigh ...
Мысль, возможно, сырой запрос будет работать. Неа! Этот метод больше не принимает строку и требуемый GremlinQuery, я понятия не имею, как вам. Grooooooooooooooooan.
var users = graphClient.ExecuteGetAllNodesGremlin<IsCustomer>("g.v(0).out('IsCustomer'){it.'Name' == 'BobTheBuilder'}");
Update 3/30/12
создал новый проект, все ниже работает отлично. Super confused, почему он будет работать здесь ... :(Может быть, различия в версии, я понятия не имею.
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();
Я нашел источник FrictionFree и пытался копировать, но получить нулевую ошибку, которая странно. Я уточню свой вопрос. – rball