Как использовать Neo4jClient для получения отношения Neo4j по его идентификатору?

Я могу создать отношение, и у меня есть его RelationshipReference. Но как мне получить остальные отношения с полезной нагрузкой и все такое?

С узлом я могу просто client.Get(nodeid), но, насколько мне известно, для отношений нет ничего похожего.


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


person LosManos    schedule 26.02.2013    source источник
comment
Посмотрите, есть ли ответ на stackoverflow.com/questions/12491221/ вам вообще помогут.   -  person Charlotte Skardon    schedule 26.02.2013
comment
@ChrisSkardon Отлично, но теперь вместо этого я получаю {Не удается получить доступ к дочернему значению в Newtonsoft.Json.Linq.JProperty.}. Их добавление в отношение вручную не помогает, и удаление ‹MyRelation› из ExecuteGetAllRelationshipsGremlin также не помогает.   -  person LosManos    schedule 26.02.2013


Ответы (2)


Вы можете использовать метод расширения для самого 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 - это класс, производный от отношения, данные просто POCO)

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);

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

person Charlotte Skardon    schedule 27.02.2013

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

// 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 должно быть всего полторы недели.)

person LosManos    schedule 27.02.2013
comment
Я думаю, что проблема в том, что метод ExecuteGetAllRelationshipsGremlin ищет набор отношений, а не один, поэтому десериализатор пытается получить набор, но вы возвращаете только одно отношение . - person Charlotte Skardon; 27.02.2013