3

私はこれに不慣れです:私は現在.Netneo4jClientを使用しています。現在、共有ノードと顧客ノードがあります。私はそれらの間に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)

しかし、これは私が必要とするデータ(Quantity、CostPerShareなど)を持たないRelationshipInstanceオブジェクトを返します。

RelationshipInstanceはRelationshipReferenceオブジェクトを公開しますが、それでも実際のリレーションシップオブジェクトを取得するのに役立ちません。もう少し深く掘り下げると、以下のようにRawgremlinクエリを実行できることがわかります。

graphClient.ExecuteGetAllRelationshipsGremlin<>()

しかし、その関数シグネチャは、 RelationshipInstanceのIEnumerableも返します。

データを使用して実際の永続化されたRelationshipオブジェクトを取得する方法に関するアイデアや提案はありますか?

前もって感謝します

4

1 に答える 1

3

これを入手するために時間を割いて申し訳ありませんが、実際に必要なのは' 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]

同様に、あなた自身へのリマインダーとして機能するためだけに。

于 2012-09-24T10:16:58.417 に答える