2012-03-28 8 views
0

Некоторые псевдо-код модели я работаю с:Как я могу получить конкретный узел 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(); 

ответ

1

Я просто начинаю.Я бы посоветовал вам проверить этот блог: http://romikoderbynew.com/2011/07/30/neo4jclient-primer/

Кроме того, для получения дополнительных примеров также проверьте http://frictionfree.org и его исходный код (в разделе about).

  • Создание отношений на существующих - как я понимаю, это возможно. Однако, по-видимому, проще ассоциировать узлы по мере их создания. Из блога:

Вы также можете создавать связи между существующими узлами. graphClient.CreateRelationship (customerNodeReference, new Говорит (languageNode.Reference));

  • RootNode - Я считаю, что вам нужно, чтобы начать запрос от узла, я не думаю, что вы можете сделать

    SELECT * FROM ... WHERE 
    

    Таким образом, это имело бы смысл, что вам нужно приложить узлов к корневому узлу. Это пример из FrictionFreeApp:

    var node = graphClient.Create(
         user, 
         new UserBelongsTo(rootNode)); 
    
+0

Я нашел источник FrictionFree и пытался копировать, но получить нулевую ошибку, которая странно. Я уточню свой вопрос. – rball