Как получить связь в базе данных графа Neo4j

Пожалуйста, потерпите меня, я новичок в этом: в настоящее время я использую .Net neo4jClient. В настоящее время у меня есть узел Поделиться и узел Клиент. Я создаю отношения CustomerOwnsShare между ними и сохраняю их.

Вот мой класс отношений

public class CustomerOwnsShare :
    Relationship,
    IRelationshipAllowingSourceNode<Customer>,
    IRelationshipAllowingTargetNode<Share>
{
    public CustomerOwnsShare(NodeReference targetNode)
        : base(targetNode)
    {

    }

    public int Quantity { get; set; }
    public float CostPerShare { get; set; }
    public string DateOfPurchase { get; set; }
    public string ShareSymbol { get; set; }

    public const string TypeKey = "CUSTOMER_OWNS_SHARE";
    public override string RelationshipTypeKey
    {
        get { return TypeKey; }
    }
}

Теперь, чтобы получить список отношений из базы данных, я использую Linq, как показано ниже.

IEnumerable<RelationshipInstance> relationshipInstances =
            graphClient.RootNode.In<Customer>(CustomerBelongsTo.TypeKey, c => c.Email == email)
            .OutE(CustomerOwnsShare.TypeKey)

Но это возвращает мне объект RelationshipInstance, который не имеет нужных мне данных (количество, CostPerShare и т. д.).

RelationshipInstance предоставляет объект RelationshipReference, но даже это не помогает мне получить мой фактический объект Relationship. Копнув немного глубже, я вижу, что могу выполнить запрос Raw gremlin, как показано ниже.

graphClient.ExecuteGetAllRelationshipsGremlin<>()

но сигнатура функции также возвращает мне IEnumerable из RelationshipInstance.

Любые идеи или предложения о том, как я могу получить свой фактический объект Relationship с его данными?

Заранее спасибо


person noob Mama    schedule 19.09.2012    source источник


Ответы (1)


Извините за время, чтобы донести это до вас, на самом деле вам нужен 'RelationshipInstance<CustomerOwnsShare>'...

Итак, давайте представим, что у меня есть следующие настройки:

Root(0) -[]-> User(1) -[CUSTOMER_OWNS_SHARE]-> MSFT(2)

Цифры в скобках — это ссылки на neo4j. Запрос, который я бы выполнил с помощью neo4jclient:

var results = graphClient.ExecuteGetAllRelationshipsGremlin<CustomerOwnsShare>("g.v(2).inE", null);
var quant = results[0].Data.Quantity; //etc

Теперь, если вы просто скопируете/вставите это, вы получите ошибку:

'CustomerOwnsShare' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TData' in the generic type or method 'Neo4jClient.GraphClient.ExecuteGetAllRelationshipsGremlin<TData>(string, System.Collections.Generic.IDictionary<string,object>)'

Это боль, способ обойти это - поместить конструктор без параметров в ваш класс CustomerOwnsShare:

[EditorBrowsable(EditorBrowsableState.Never)]
public CustomerOwnsShare() : base(0) { }

Это нормально для вас, так как TargetNode будет установлен десериализатором. Однако вы действительно хотите убедиться, что сами не используете этот конструктор. «EditorBrowsable» предотвратит его просмотр внешними сборками, но, к сожалению, ничего не сделает для кода в той же сборке, поэтому вы можете пометить его как:

[Obsolete]

а также, просто чтобы действовать как напоминание о себе.

person Charlotte Skardon    schedule 24.09.2012