عمليات CRUD مع الكيانات في DialogFlow (C #)

المقدمة


في الآونة الأخيرة ، بدأت العمل في مشروع جديد ، تضمن العمل مع خدمة Google المعروفة بالفعل (AI) - DialogFlow. خلاصة القول هي أنه كان لدينا روبوت (Telegram) يعمل مع واجهة برمجة التطبيقات للعديد من المواقع ، بينما ساعدنا DialogFlow نفسه في تنظيم الاتصال مع شخص ، والذي تم إنشاؤه بشكل أساسي. يجب أن أقول أن المقالة مخصصة للأشخاص الذين بدأوا للتو في التعرف على الخدمة أو لديهم بالفعل خبرة قليلة ، لذا فإن المصطلحات التالية ممكنة: النية ، السياق ، العمل ، الحدث ، ولما جمعناه من أجل - الكيانات. آمل أن تكون المقالة مفيدة لأولئك الذين لم يفهموا قليلاً كيف يمكن بالضبط من خلال عمليات CRUD البرمجية مع الكيانات أن تتم.

الكيانات في DialogFlow


في DialogFlow الكيانات هي بعض الكيانات التي تتكون من ReferenceValue والمرادفات. شيء مشابه للقيمة الأساسية ، فقط مع اختلاف أنه يمكن أن يكون هناك الكثير من المرادفات ، وكلما كان هناك ، كلما كان ذلك أفضل ، لأنه "يبسط حياة الروبوت" ويسهل عليه فهم القيمة التي يتم الحديث عنها ، وعلامة الاختيار ستساعد المطابقة غير الواضحة البوت أيضًا على فهم ما هو على المحك ، حتى إذا فاتك حرف واحد أو رمز آخر. يبدو الأمر مثل هذا:

موسكو - موسكو ، موسكو ، موسكو ... بعد

الانتهاء من رحلة قصيرة ، أود أن أضيف أنه مع الكيان هناك الكثير من الضجة. بالطبع ، لا أقوم بتقليل معنى المقاصد ، وما إلى ذلك ، لكن الحقيقة تبقى.

أنواع الكيان


كان هنا أول مأزق ، وإن كان صغيرا ، بالنسبة لي. بعد كل شيء ، يحتوي التوثيق على طرق للعمل مع Entity ، وهناك طرق للعمل مع EntityType - أي منهم ما هو؟

في الواقع ، كل شيء ليس معقدًا للغاية ، فقط يحدث الارتباك بسبب حقيقة أن علامة التبويب في DialogFlow نفسها تسمى EntityTypes تسمى Entities:

صورة

EntityType: Entitie صورة

: على صورة

الرغم من أنه يعتقد في DialogFlow نفسه أن هناك كيان ولديه إدخالات (أي الجوهر والمداخل فيه).

هيا لنذهب.

يمكنك إنشاء EntityType يدويًا مباشرة على DialoFlow ، لكنني سأوضح كيف يمكن القيام بذلك من خلال الكود (بعد كل شيء ، من أجل إنشاء الكيانات ، سنحتاج إلى معرفة نوع EntityType).

أولاً ، قم بتمكين حزمة NuGet Google.Cloud.Dialogflow.V2. في وقت كتابة هذا التقرير ، تم تثبيت الإصدار 1.1.0:

صورة

أولاً نقوم بإنشاء فئة ونطلق عليها EntityTypeManagement حيث ستكون هناك عمليات أساسية:

using Google.Api.Gax;
using Google.Cloud.Dialogflow.V2;

public class EntityTypeManagement
    {
      //Create -   EntityType   Test1 (  ) 
      //projectId - Id    DialogFlow
      //displayName -         
        public async Task Create(string projectId, string displayName, EntityType.Types.Kind kind = 
      EntityType.Types.Kind.Map)
        {
            var client = await EntityTypesClient.CreateAsync();

            var entityType = new EntityType();
            entityType.DisplayName = displayName;
            entityType.Kind = kind;

            var createdEntityType = client.CreateEntityType(
                parent: new ProjectAgentName(projectId),
                entityType: entityType
            );

            Console.WriteLine($"Created EntityType: {createdEntityType.Name}");
        }
       
      //List -   EntityTypes   
      //projectId - Id    DialogFlow
        public async Task<PagedEnumerable<ListEntityTypesResponse,EntityType>> List(string projectId)
        {
            var client = await EntityTypesClient.CreateAsync();
            var response = client.ListEntityTypes(
                parent: new ProjectAgentName(projectId)
            );
            return response;
        }

       //GetEntityTypeId -  EntityType  
       //projectId - Id    DialogFlow
       //targetEventTypeName -  EntityType,    
        public async Task<string> GetEntityTypeId(string projectId,string targetEventTypeName)
        {
            var client = await EntityTypesClient.CreateAsync();
            var response = client.ListEntityTypes(
                parent: new ProjectAgentName(projectId)
            );
            string id = response.Where(x => x.DisplayName == targetEventTypeName).FirstOrDefault().Name;
            string returningId = id.Replace($"projects/{projectId}/agent/entityTypes/", "");
            return returningId;
        }

       //Delete  BatchDelete      EntityType
       //   entityTypeId
        public async Task Delete(string projectId, string entityTypeId)
        {
            var client = await EntityTypesClient.CreateAsync();

            client.DeleteEntityType(new EntityTypeName(projectId, entityTypeId: entityTypeId));

            Console.WriteLine($"Deleted EntityType: {entityTypeId}");

        }

        
        public async Task BatchDelete(string projectId, IEnumerable<string> entityTypeIds)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entityTypeNames = entityTypeIds.Select(
                id => new EntityTypeName(projectId, id).ToString());
            client.BatchDeleteEntityTypes(new ProjectAgentName(projectId),
                entityTypeNames);
        }
    }

هنا يجب أن يقال على الفور أنه لا توجد وظيفة تحديث فقط لأن Create يؤدي وظيفته بالفعل.

الآن لدينا الأساليب الأساسية للعمل مع EntityTypes ، فلننتقل إلى Entity وننشئ على الفور فئة EntityManagement:

public class EntityManagement
    {
       using Google.Cloud.Dialogflow.V2;        


      //Create -    Entity
      //entityTypeId - Id EntityType      Entity
      //entityValue - ReferenceValue  Entity
      // synonyms -    Entity
        public async Task Create(string projectId,
                                 string entityTypeId,
                                 string entityValue,
                                 string[] synonyms)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entity = new EntityType.Types.Entity() { Value = entityValue};
            entity.Synonyms.AddRange(synonyms);
            
            var operation = await client.BatchCreateEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entities: new[] { entity }
            ); 
            operation.PollUntilCompleted();
        }

       //CreateMany -   Entities 
       //entityTypeId - Id EntityType      Entity
       //entities -  Entities  
        public async Task CreateMany(string projectId,string entityTypeId, IEnumerable<Entity> entities)
        {
            var client = await EntityTypesClient.CreateAsync();
            List<EntityType.Types.Entity> results = new List<EntityType.Types.Entity>();
            foreach (var item in entities)
            {
                var entity = new EntityType.Types.Entity() { Value = item.value };
                entity.Synonyms.AddRange(item.synonyms);
                results.Add(entity);
            }
           
            var operation = await client.BatchCreateEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entities: results.ToArray());
            operation.PollUntilCompleted();
        }

      //Delete -    Entity,   "string entityValue"   
     //string[] entityValue      entityValues: entityValue
     //    .
        public async Task Delete(string projectId, string entityTypeId, string entityValue)
        {
            var client = await EntityTypesClient.CreateAsync();

            var operation = await client.BatchDeleteEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entityValues: new[] { entityValue }
            );

            Console.WriteLine("Waiting for the entity deletion operation to complete.");
            operation.PollUntilCompleted();

            Console.WriteLine($"Deleted Entity: {entityValue}");

        }
        
      //List -   Entities  EntityType 
     public async Task<List<Entity>> List(string projectId, string entityTypeId)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entityType = await client.GetEntityTypeAsync(new EntityTypeName(
                projectId, entityTypeId
            ));
            List<Entity> EntitiesList = new List<Entity>();
            
            foreach (var entity in entityType.Entities)
            {
                List<string> Synonyms = new List<string>();
                foreach (var item in entity.Synonyms)
                {
                    Synonyms.Add(item);
                }
                EntitiesList.Add(new Entity { value = entity.Value, synonyms = Synonyms.ToArray() });
                Synonyms = null;
            }

            return EntitiesList;
        }
    }

أضف نموذجنا الذي سيمثل الكيان:

public class Entity
    {
        public string value { get; set; }
        public string[] synonyms { get; set; }
    }

تم ، جميع ميزات CRUD الأساسية جاهزة. مرة أخرى ، بالعودة إلى التحديث ، يمكن تنفيذه بشكل منفصل ، ولكن ببساطة ليس هناك حاجة إليه ، لأن الإنشاء يعمل مثل التحديث أيضًا.

الأمثلة بسيطة للغاية ، ويجب أن أوافق ، لا يزال هناك "رمز ثابت" ، ولكن آمل أن تكون المقالة مفيدة لأولئك الذين لم يتمكنوا ، مثلي ، من معرفة كيفية إجراء عمليات CRUD بشكل صحيح من خلال التعليمات البرمجية.

static void Main(string[] args)
        {
      EntityTypesManagement entityTypesManagement = new EntityTypesManagement();
      EntityManagement entityManagement = new EntityManagement();
       string ProjectId = "Your Project`s id";
       string EntityName = "Your EntityName";
      var entityId = await entityTypesManagement.GetEntityTypeId(ProjectId, EntityName);
       Entity entity =  new Entity{value = "1", synonyms = new[]{"1","1"}};
      /*await*/ entityManagement.Create(ProjectId,entityId,entity);
 }

Source: https://habr.com/ru/post/undefined/


All Articles