2013-02-26 4 views
1

Я могу создать отношение, и у меня есть его отношение. Но как мне получить остальную часть отношений с полезной нагрузкой и все?Как использовать Neo4jClient для получения отношения Neo4j по его идентификатору?

С узлом я могу просто client.Get (nodeid), но AFAIK нет ничего подобного для отношений.


Есть ли Гремлин, как идти? Если это так - мог бы кто-нибудь дать мне подсказку, поскольку я все еще испытываю и ужасаю, как это сделать через Neo4jClient.

+1

Пожалуйста, смотрите, если ответ на http://stackoverflow.com/questions/12491221/how-do-i-retrieve -a-relationship-in-neo4j-graph-database помогает вам вообще. –

+0

@ChrisSkardon Perfect - но теперь я получаю {«Не могу получить доступ к дочернему значению на Newtonsoft.Json.Linq.JProperty."}. Это не помогает добавить их вручную в отношение, и удаление из ExecuteGetAllRelationshipsGremlin тоже не помогает. – LosManos

ответ

3

Вы можете использовать метод расширения для самого IGraphClient:

public static class GraphClientExtensions 
{ 
    public static RelationshipInstance<T> GetRelationship<T>(this IGraphClient graphClient, RelationshipReference relationshipReference) where T : Relationship, new() 
    { 
     if(graphClient == null) 
      throw new ArgumentNullException("graphClient"); 
     if(relationshipReference == null) 
      throw new ArgumentNullException("relationshipReference"); 

     var rels = graphClient.ExecuteGetAllRelationshipsGremlin<T>(string.Format("g.e({0}).outV.outE", relationshipReference.Id), null); 
     return rels.SingleOrDefault(r => r.Reference == relationshipReference); 
    } 
} 

использование: (IsFriendOf это отношения производного класса, данные просто ПОКА)

var d1 = new Data{Name = "A"}; 
var d2 = new Data{Name = "B"}; 

var d1Ref = graphClient.Create(d1); 
var d2Ref = graphClient.Create(d2); 
var rel = new IsFriendOf(d2Ref) { Direction = RelationshipDirection.Outgoing }; 
var relRef = graphClient.CreateRelationship(d1Ref, rel); 

//USAGE HERE 
var relBack = graphClient.GetRelationship<IsFriendOf>(relRef); 

это не идеально, но это делает ваш код немного легче читать. (Кроме того, вы не должны знать, узлы, только ссылки на отношения)

0

Как вариант this я получил эту работу:

// Get every relation going out from the node we used as out-node 
// when we created the relation. 
var query = string.Format("g.v({0}).outE", fromNodeID); 
var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
    query, null 
); 
// We can get too many so filter per ID. 
var rel = rels.Single(r => r.Reference.Id == relID); 

Но это не так, как я хочу работать. У меня есть идентификатор, и самый быстрый из них - использовать его, не так ли?

Я попытался

var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
    "g.e(42)", null 
); 

, но все, что происходит, что я получаю исключение:

{"Cannot access child value on Newtonsoft.Json.Linq.JProperty."} 

Там нет ничего в полезной нагрузке сериализации, чтобы начать с. (ошибка?) Также: удаление <MyPayload> не помогает. Поэтому я не думаю, что это проблема десериализации; но результат запроса «g.e (42)» не совпадает с «g.v (11) .outE», упомянутым в качестве рабочего обходного пути.

(Neo4j версия 1.9.M04 и мой Neo4jClient должен быть только полторы недели назад.)

+0

Я * думаю *, что проблема в том, что метод ExecuteGetAllRelationshipsGremlin ищет коллекцию отношений, а не только одну, поэтому десериализатор пытается получить коллекцию, но вы возвращаете только одно отношение. –

Смежные вопросы