gremlinの使用ASP . NETからASP . NET.NET Webアプリケーション


導入


この記事では、使用方法を説明しますGremlin.Net ASP . NETからGremlInサーバーに接続して送信するには.NET Webアプリケーション.
あなたが沿って続くことを望むならば、あなたは「gremlinサーバー」と「Gremlinコンソール」を必要としますApache Tinkerpop Website . そして、あなたは必要があります.からダウンロードできるネットSDKhere .

gremlinサーバーを実行し、サンプルデータを追加する


GremlInサーバールートフォルダに移動し./bin/gremlin-server.sh LinuxまたはMacの場合.または走る.\bin\gremlin-server.bat あなたがWindowsであるならば.これはgremlinサーバを起動し、どのポートを聞いているかを教えます.ポートはデフォルトでは"8182 "です.

次に、「gremlin」コンソールルートフォルダに移動して実行します../bin/gremlin.sh LinuxまたはMacの場合.または走る.\bin\gremlin.bat あなたがWindowsであるならば.これはgremlinコンソールを起動します.

グレムリンコンソールで次のコマンドを入力します.
:remote connect tinkerpop.server conf/remote.yaml
:remote console
最初のコマンドはgremlinコンソールをgremlinサーバに接続します.そして、2番目のコマンドはgremlinコンソールに以下のコマンドをすべてサーバに送るように指示します:> .
それでは、2つの頂点を作りましょう.NET Webアプリケーション.
g.addV('person').property('firstName', 'First').property('lastName', 'Person')
g.addV('person').property('firstName', 'Second').property('lastName', 'Person')

ASPを作成します。NET Webアプリケーション


ASP . NETスクリプトを作成するフォルダに移動します.次に、次のコマンドを実行します
dotnet new webapp
次に、gremlinを追加します.次のコマンドを実行してNet Nugetパッケージを作成します.
dotnet add package Gremlin.Net

gremlinクライアントオブジェクトを登録する


次に、「Webアプリケーションプロジェクトのルートフォルダ」を開きます.いくつかのコードを書く必要がありますConfigureServices() グレムリンクライアントオブジェクト(またはそのファクトリメソッド)をコンテナーに追加する方法.
必要なgremlinクライアントオブジェクトはGremlinClient and GraphTraversalSource . The GremlinClient グレムリンサーバにスクリプトを送信するために使用できます.それはあなたができるだけ避けるべき何かです.しかし、グラフスキーマを定義し、インデックスを作成するようなタスクのための唯一のオプションです.The GraphTraversalSource ラップするGremlinClient また、グレムリンの横断を構築し、サーバーに送信するためのより良いインターフェイスを提供します.だからGraphTraversalSource あなたがほとんどの時間を使用するものです.
大きな問題は次のとおりです.ASP .NET Service Containerには、型を登録するための3つのライフタイムオプションを指定します.

  • Transient :コンテナからインスタンスが要求されるたびに新しいオブジェクトが作成されます.

  • スコープ:新しいオブジェクトはHTTPリクエストあたり1回だけ作成され、同じリクエスト処理中に必要に応じて何度でも再利用されます.

  • Singleton :アプリケーションの寿命ごとに1つのオブジェクトだけが作成されます.そして、この1つのオブジェクトは、並行して並行して実行されているHTTPアプリケーションリクエストを処理するために、すべてのWebアプリケーションスレッドによって使用されます.
  • GremlinClient スレッドセーフです.それで、それはシングルトンとして登録されることができます.そして、gremlinclientのすべてのインスタンスが接続プールを含むので、あなたはおそらくそれをしたいでしょう.そして、gremlinclientのインスタンスを作成するたびに、プールを満たすのに必要なデータベースサーバーへの多くの接続として開きます.したがって、gremlinclientのインスタンスを作成する場合は、通常、アプリケーションの寿命で一度以上行うにはしない非常に高価な操作です.gremlinclientインスタンスは特定のデータベースサーバーにバインドされていますので、複数のインスタンスを作成する唯一の理由は、複数のデータベースサーバーに接続したい場合です.GraphTraversalSource スレッドも安全です.それで、それはシングルトンとして登録されることができます.しかし、GraphTravelSourceのインスタンスを作成するには、すでにgremlinclientを作成する必要がある場合は非常に安いです.したがって、一時的な、またはスコープされたサービスとしてGraphTravelSourceを登録すると、それは痛みません.GraphTravelSourceは、データベースサーバー上の特定のグラフにバインドされます.アプリケーションが複数のグラフにアクセスする必要がある場合は、複数のGraphTravelSourceインスタンスを作成する必要があります.
    更新ConfigureServices() 「起動時cs」の機能を登録するGremlinClientGraphTraversalSource シングルズとして.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<GremlinClient>(
            (serviceProvider) =>
            {
                var gremlinServer = new GremlinServer(
                    hostname: "localhost",
                    port: 8182,
                    enableSsl: false,
                    username: null,
                    password: null
                );
    
                var connectionPoolSettings = new ConnectionPoolSettings
                {
                    MaxInProcessPerConnection = 32,
                    PoolSize = 4,
                    ReconnectionAttempts = 4,
                    ReconnectionBaseDelay = TimeSpan.FromSeconds(1)
                };
    
                return new GremlinClient(
                    gremlinServer: gremlinServer,
                    connectionPoolSettings: connectionPoolSettings
                );
            }
        );
    
        services.AddSingleton<GraphTraversalSource>(
            (serviceProvider) =>
            {
                GremlinClient gremlinClient = serviceProvider.GetService<GremlinClient>();
                var driverRemoteConnection = new DriverRemoteConnection(gremlinClient, "g");
                return AnonymousTraversalSource.Traversal().WithRemote(driverRemoteConnection);
            }
        );
    
        services.AddRazorPages();
    }
    
    "g" 与えられたDriverRemoteConnection ローカルのGraphTravelSourceがバインドされているサーバー側のGraphTravelSourceの識別子です.サーバーが複数のグラフを持っている場合、それぞれのクライアントは別のGraphTravelSource識別子でリモートクライアントに公開されます.

    グレムリン横断を実行する


    プロジェクトルートフォルダの下にある「ページ/index . cshtml . cs」を開きます.プライベートプロパティとコンストラクターを変更して、GraphTraversalSource の代わりにILogger .
    private readonly GraphTraversalSource _g;
    
    public IndexModel(GraphTraversalSource g)
    {
        _g = g;
    }
    
    次に、IndexModel データベースから取得するデータを保持する.
    public IList<IDictionary<string, object>> People { get; set; }
    
    残念なことに、GremlIn横断は強く型付けられたモデルを返さない.ここでリストの項目は人々を表します.辞書は、プロパティ名と人の値を保持します.もちろん、このプロパティ辞書を厳密に型指定されたオブジェクトにマップする方法があります.しかし、私はこの記事の基礎に集中したいので、ここでこれをしません.
    次に、グレムリン横断をOnGet() gremlinサーバからデータを取得し、それをPeople プロパティ.
    public void OnGet()
    {
        People = _g.V()
            .HasLabel("person")
            .Project<object>("Id", "FirstName", "LastName")
                .By(T.Id)
                .By("firstName")
                .By("lastName")
            .ToList();
    }
    
    上記のコードにしたい小さな拡張機能があります.IOブロックを非同期的に実行することは常に良いので、スレッドをブロックしません.グレムリン.NETは、Promise() 非同期で横断を実行する関数.では、次のようにしましょうOnGet() メソッドasync.置換.ToList() そば.Promise(traversal => traversal.ToList()) .
    public async Task OnGetAsync()
    {
        People = await _g.V()
            .HasLabel("person")
            .Project<object>("Id", "FirstName", "LastName")
                .By(T.Id)
                .By("firstName")
                .By("lastName")
            .Promise(traversal => traversal.ToList());
    }
    

    ビュー内のtraversal結果を表示する


    プロジェクトルートフォルダーの下にある「ページ/index . cshtml」を開き、次のカラーコードを書き込み、グラフデータベースから取得したPersonデータを表示します.
    @if (!Model.People.Any())
    {
        <p>There are no people in the database.</p>
    }
    else
    {
        <table border="1" cellpadding="5">
            <tr>
                <th>ID</th>
                <th>First Name</th>
                <th>Last Name</th>
            </tr>
    
            @foreach (Dictionary<string, object> person in Model.People)
            {
                <tr>
                    <td>@person["Id"]</td>
                    <td>@person["FirstName"]</td>
                    <td>@person["LastName"]</td>
                </tr>
            }
        </table>
    }
    

    Webアプリケーションを実行する


    Webアプリケーションルートフォルダに移動し、次のコマンドを実行します.
    dotnet run
    
    次に、お好みのWebブラウザからhttps://localhost:5001/
    あなたのWebサーバが何を聞いているポートでポート番号を置き換える必要があります.
    すべてが期待通りに働いているならば、あなたは2つの「Person」記録がホームページに示されるのを見るべきです.これらの2つのレコードは、我々がgremlinコンソールから以前に加えた2つの頂点から来ています.

    この記事のコードスニペットはGithubhttps://github.com/JoinTheGraph/GremlinWeb