সাবলীল এপিআইতে প্রাকৃতিক ভাষার ব্যাকরণ ব্যবহার করা


14

আমি ওয়েবএসকিউএল / ফোনগ্যাপ ডেটাবেস এপিআই-তে একটি প্রশ্নের উত্থাপনের সাথে ঝাঁকুনি দিচ্ছি এবং আমি নিজেকে উভয়ই আঁতকে উঠতে এবং সন্দেহজনক বলে মনে করি যে একটি প্রাকৃতিক ইংরেজি ভাষার ব্যাকরণের ব্যবহারকে অনুকরণ করে এমন একটি সাবলীল এপিআই সংজ্ঞায়িত করে।

উদাহরণগুলির মাধ্যমে এটি ব্যাখ্যা করা সবচেয়ে সহজ হতে পারে। নীচে আমার ব্যাকরণে সমস্ত বৈধ প্রশ্ন রয়েছে, এবং মন্তব্যগুলি উদ্দেশ্যকৃত অর্থ ব্যাখ্যা করেছে:

//find user where name equals "foo" or email starts with "foo@"
find("user").where("name").equals("foo").and("email").startsWith("foo@")

//find user where name equals "foo" or "bar"
find("user").where("name").equals("foo").or("bar");

//find user where name equals "foo" or ends with "bar"
find("user").where("name").equals("foo").or().endsWith("bar");

//find user where name equals or ends with "foo"
find("user").where("name").equals().or().endsWith("foo");

//find user where name equals "foo" and email is not like "%contoso.com"
find("user").where("name").equals("foo").and("email").is().not().like("%contoso.com");

//where name is not null
find("user").where("name").is().not().null();

//find post where author is "foo" and id is in (1,2,3)
find("post").where("author").is("foo").and("id").is().in(1, 2, 3);

//find post where id is between 1 and 100
find("post").where("id").is().between(1).and(100);

কোয়ান্টিন প্রদেটের প্রতিক্রিয়ার ভিত্তিতে সম্পাদনা করুন : এগুলি ছাড়াও মনে হয়, এপিআই'র বহুবচন এবং একক উভয় ক্রিয়া ফর্মকে সমর্থন করতে হবে, সুতরাং:

//a equals b
find("post").where("foo").equals(1);

//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);

প্রশ্নের খাতিরে, ধরে নেওয়া যাক যে আমি এখানে সমস্ত সম্ভাব্য নির্মাণগুলি শেষ করেছি না। আসুন আমরা ধরেও নিই যে আমি বেশিরভাগ সঠিক ইংরেজি বাক্যগুলি আবরণ করতে পারি - সর্বোপরি, ব্যাকরণটি এসকিউএল দ্বারা সংজ্ঞায়িত ক্রিয়া এবং কনজিকশনগুলির মধ্যে সীমাবদ্ধ।


দলবদ্ধকরণ সম্পর্কিত সম্পাদনা করুন : একটি "বাক্য" একটি গ্রুপ, এবং অগ্রাধিকার এসকিউএল: বাম থেকে ডানদিকে সংজ্ঞায়িত করা হয়েছে। একাধিক whereবক্তব্য সহ একাধিক গ্রুপিং প্রকাশ করা যেতে পারে :

//the conjunctive "and()" between where statements is optional
find("post")
  .where("foo").and("bar").equal(2).and()
  .where("baz").isLessThan(5);

যেহেতু আপনি দেখতে পারেন, প্রতিটি পদ্ধতির সংজ্ঞা "একত্রে পদ্ধতি" আর্গুমেন্ট প্রাপ্ত করতে ব্যাকরণগত প্রসঙ্গ এটা হয় উপর নির্ভরশীল। উদাহরণস্বরূপ or()এবং and()পারেন বাদ করা যেতে পারে, বা একটি ক্ষেত্র নাম পড়ুন বা প্রত্যাশিত মান।

আমার কাছে এটি খুব স্বজ্ঞাগত বোধ করে তবে আমি আপনার মতামত শুনতে চাই: এটি কি একটি ভাল, দরকারী এপিআই, না আমার আরও সোজা বাস্তবায়নের ব্যাকডিয়াল করা উচিত?

রেকর্ডের জন্য: এই লাইব্রেরিটি কনফিগারেশন আইটেমগুলির উপর ভিত্তি করে আরও প্রচলিত, অ-সাবলীল এপিআই সরবরাহ করবে।


1
চেইনিং এছাড়াও jQuery খুব বিখ্যাত কেন। বেশ সোজা-এগিয়ে, অনুক্রমিক এবং বোধগম্য।
জোসেফ

3
এটা মজার! আপনার সম্ভবত প্রোগ্রামারদের উপর এটি জিজ্ঞাসা করা উচিত।
বেনিয়ামিন গ্রুইনবাউম

2
আপনি কিভাবে গ্রুপিং পরিচালনা করবেন? সমতুল্য: ... where foo = 1 or (bar = 2 and qux = 3)?

7
আইএমও এই ধরণের সাবলীল এপিআই ভয়ঙ্কর। উদাহরণস্বরূপ অপারেটরের নজির অভাব বিরক্তিকর। আমি পার্স চাই where("name").equals("foo").or("bar")যেমন (name=="foo")or bar। তারপরে এটি স্পষ্ট হয় না যে কোনও স্ট্রিং কখন আক্ষরিক প্রতিনিধিত্ব করে এবং কবে এটি একটি কলামের নাম উপস্থাপন করে ...
CodeInChaos

4
BTW। আপনি যদি কোনও ডাটাবেস অনুসন্ধানের জন্য কোনও ডিএসএল ব্যবহার করতে চান তবে আপনি এসকিউএল নামক বিদ্যমান ডিএসএল ব্যবহার করতে পারেন।
কোডসইনচাওস

উত্তর:


23

আমি মনে করি এটি খুব ভুল আমি প্রাকৃতিক ল্যাঙ্গেজ অধ্যয়ন করি এবং এটি অস্পষ্টতায় পূর্ণ যা কেবল প্রসঙ্গ এবং প্রচুর মানব জ্ঞানের সাহায্যে সমাধান করা যায়। প্রোগ্রামিং ভাষা অস্পষ্ট নয় এই বিষয়টি খুব ভাল জিনিস! আমি মনে করি না আপনি প্রসঙ্গ অনুসারে পদ্ধতির অর্থ পরিবর্তন করতে চান:

  • আপনি অস্পষ্টতা আনার পরে এটি আরও বিস্ময় প্রকাশ করে
  • আপনার ব্যবহারকারীরা এমন নির্মাণগুলি ব্যবহার করতে চাইবেন যা আপনি আবৃত করবেন না, যেমন। find("user").where("name").and("email").equals("foo");
  • ত্রুটিগুলি রিপোর্ট করা শক্ত: আপনি কী করতে পারেন find("user").where("name").not().is().null();?

আসুন আমরা ধরেও নিই যে আমি বেশিরভাগ সঠিক ইংরেজি বাক্যগুলি আবরণ করতে পারি - সর্বোপরি, ব্যাকরণটি এসকিউএল দ্বারা সংজ্ঞায়িত ক্রিয়া এবং কনজিকশনগুলির মধ্যে সীমাবদ্ধ।

না, আপনি বেশিরভাগ সঠিক ইংরেজি বাক্যগুলি আবরণ করতে পারবেন না। অন্যরা এর আগে চেষ্টা করেছে এবং এটি খুব দ্রুত জটিল হয়ে যায়। একে প্রাকৃতিক ভাষার বোঝাপড়া বলা হয় তবে সত্যই কেউ চেষ্টা করে না: আমরা প্রথমে ছোট সমস্যাগুলি সমাধান করার চেষ্টা করছি। আপনার গ্রন্থাগারের জন্য, আপনার কাছে মূলত দুটি বিকল্প রয়েছে:

  • হয় আপনি নিজেকে ইংরেজির একটি উপসেটে সীমাবদ্ধ রাখুন: এটি আপনাকে এসকিউএল দেয়,
  • অথবা আপনি "ইংরাজী" কভার করার চেষ্টা করেছেন এবং আপনি খুঁজে পেয়েছেন যে ভাষার অস্পষ্টতা, জটিলতা এবং বৈচিত্র্যের কারণে এটি সম্ভব নয়।

আপনার ইনপুট জন্য ধন্যবাদ। আপনি তালিকাভুক্ত প্রথম কেসটি কাভার করতে আমার প্রশ্ন সম্পাদনা করেছেন এবং কিছু ক্যাভেট যোগ করেছেন। আমি অস্পষ্টতার বিষয়ে আপনার অবস্থানের সাথে একমত - এটি আমার প্রশ্নের মূল বিষয়। প্রোগ্রামিং ভাষাগুলি কী সংজ্ঞায়িত প্রাসঙ্গিক ক্ষেত্রে উচ্চাভিলাষী হতে গ্রহণযোগ্য?
ফেনক্লিফ

যদি এটি অস্পষ্ট হয় তবে এটি সংজ্ঞায়িত নয়। যদি এটি অস্পষ্ট হয় তবে একাধিক সম্ভাব্য ফলাফল রয়েছে এবং এর মধ্যে একটির কিছু বেছে নিতে হবে। হয় পছন্দটি সঠিকভাবে সংজ্ঞায়িত হবে, বা ভাষা পার্সার এলোমেলোভাবে বেছে নেবে। সুতরাং, যদি আপনি কোনও স্টোকাস্টিক ভাষা (1 + 1 সমান 2 এর সমান হতে পারে এবং কখনও কখনও 1 বা 3 এর সমতুল্য হতে পারে) ডিস্ট্রিমেন্টিকের বিপরীতে (1 + 1 সর্বদা 2 সমান হয়) চান তবে প্রোগ্রামিং ভাষার ক্ষেত্রে অস্পষ্টতা ঠিক আছে।
মাইকেল পাউলুকোনিস

আপনি কি তার প্রস্তাব বা ইংরেজির কথা বলছেন? বেশিরভাগ সময়, অস্পষ্টতা প্রসঙ্গে এবং / বা জ্ঞান (যার অংশটি সাধারণ জ্ঞান) ব্যবহার করে কম্পিউটারের কাছে উপলভ্য নয় এমন সমস্যাগুলি সমাধান করা যেতে পারে।
কোয়ান্টিন প্রদেশ

+1 একটি সাবলীল এপিআইয়ের তার নির্দিষ্ট প্রয়োগের প্রসঙ্গে সংবেদনশীলতা সম্পর্কে ভাল ধারণা। আমি তার প্রথমবারের মতো তার সাবলীল এপিআইয়ের ধারণাটি পছন্দ করেছি তবে এটি দেখতে এতটা নিবিড়ভাবে দেখিনি। অবশ্যই বিশাল সমস্যা।
জিমি হোফা

যদি সে ব্যাকরণকে দ্ব্যর্থহীন ও প্রসঙ্গমুক্ত করে তোলে তবে বিষয়টি কী? নিশ্চিত যে তারা বহুবচন পদগুলিতে ক্রিয়াপদের একক রূপ এবং এ জাতীয় জিনিসগুলি সরাতে চাইবে, তবে তারা যা করার চেষ্টা করেছিল তার মূল পরিবর্তন হয় না। আপনার is()বা equal()শুধুমাত্র ছিল না equals()। এর পরে রিপোর্টিং ত্রুটি সহ আপনার সমস্যাটি দেখতে পাবেন না। null()একটি সিনট্যাক্স ফাংশন না হয়ে তুলনার তুলনায় আক্ষরিক হয়ে উঠবে। find("user").where("name").is().not().null();হয়ে যায়find("user").where("name").not().equals(null);
WHN

3

আমি অন্যের পোস্টগুলির সাথে কিছুটা একমত হতে চাই যে এটি দুর্দান্ত নকশা নয়। তবে আমি বিশ্বাস করি আমার বিভিন্ন কারণ রয়েছে reasons

আপনি এসকিউএল প্রশ্নের জন্য কংক্রিট সিনট্যাক্স হিসাবে যা দেখছি তা উপস্থাপন করছেন। আমি দৃ strongly়ভাবে বিশ্বাস করি যে কংক্রিট বাক্য গঠন কখনই কোনও ভাষায় সহায়তা করতে পারে না, কেবল খারাপ হলেই তা আহত হয়।

তবে বিমূর্ত সিনট্যাক্স একটি আলাদা গল্প। বিমূর্ত সিনট্যাক্সটি আপনার ভাষার কাঠামো এবং বড় বাক্যাংশগুলি কীভাবে বাক্যাংশগুলিকে একত্রিত করা যেতে পারে তার সংজ্ঞা দেয়। আমি অনুভব করি যে কোনও ভাষার সাফল্য তার বিমূর্ত সিনট্যাক্স সংজ্ঞাটির মানের উপর দৃ of়ভাবে নির্ভর করে।

অনর্গল এপিআইয়ের সাথে আমার সমস্যাটি এটি অস্পষ্ট, বা অস্পষ্ট, বা অভিব্যক্তিক নয় - এটি হ'ল এটি আসল ভাষা এবং এর কাঠামোটি আড়াল করে এবং এর ফলে জিনিসগুলি যতটা জটিল হতে পারে তার চেয়ে অনেক জটিল করে তোলে ( অস্পষ্টতা, অ-সুস্পষ্ট সিনট্যাক্স ত্রুটি ইত্যাদি প্রবর্তন করে)।

যেহেতু আপনি উল্লেখ করেছেন যে আপনি একটি "আরও প্রচলিত এপিআই" সরবরাহ করবেন তাই মনে হচ্ছে আপনি এটি ইতিমধ্যে জানেন। আমি যে "ভাল!" তবে এর অর্থ এই নয় যে আপনি সমান্তরালে আপনার সাবলীল এপিআইও বিকাশ করতে পারবেন না! একটি একক বিমূর্ত সিনট্যাক্স সংজ্ঞা একাধিক কংক্রিট সিনট্যাক্স সমর্থন করতে পারে। আপনার মনে রাখা উচিত যে বিমূর্ত সিনট্যাক্সই আসল চুক্তি, একটি কংক্রিট বাক্য গঠনও খুব সহায়ক হতে পারে।


2

কোয়ান্টিন প্রদেটের খুব ভাল বিষয় ছাড়াও আমি এই ভাষার কথিত সুবিধাগুলি সম্পর্কে সন্দেহবাদী।

সম্ভবত প্রাকৃতিক ভাষার নিকটবর্তী ব্যাকরণের বিন্দুটি এটিকে অ্যাক্সেসযোগ্য করে তোলা। তবে এসকিউএল ইতিমধ্যে প্রাকৃতিক ভাষার বেশ কাছাকাছি। এগুলির মধ্যে একটির কি অন্যের তুলনায় ইংরেজির আরও ঘনিষ্ঠতা রয়েছে?

find("user").where("name").equals("foo")

select user from table where name = 'foo'

স্বজ্ঞাততা বা পঠনযোগ্যতার দৃষ্টিকোণ থেকে আমি আপনার ব্যাকরণের সুবিধাটি সত্যিই দেখতে পাচ্ছি না। প্রকৃতপক্ষে, এসকিউএল সংস্করণটি তার সাদা স্থানের কারণে আরও পঠনযোগ্য (এবং টাইপ করা সহজ) বলে মনে হচ্ছে।


2

একটি সংখ্যা আছে খারাপ আদর্শ নকশা সিদ্ধান্ত যে এই এপিআই বিবেচনা করা হয়েছে বলে মনে হচ্ছে কম।

প্রথমটি ইউটিলিটির প্রশ্ন - এটি কোন উদ্দেশ্যে কাজ করে? এটি একটি ডেটা স্ট্রাকচার তৈরি করছে বলে মনে হচ্ছে যা এসকিউএল এর একটি উপভাষায় সংকলন করবে। ঘটনাচক্রে, ব্যাকরণটি এসকিউএল এর একটি সীমিত সেট বলে মনে হয়। "এসকিউএল ব্যবহারের মাধ্যমে এটি কী লাভ করে?" চাবি হয়ে যায়। এটিতে যথাযথ ইন্টারপোলেশন সহ কেবল স্ট্রিং লেখার চেয়ে যদি সাবলীল ইন্টারফেস ব্যবহার করে লেখা আরও জটিল হয় তবে এই এপিআই ব্যবহার করে কেউ লিখতে পারবে না।

ইংরাজী অস্পষ্ট। ইংরেজিতে একটি সাবলীল ইন্টারফেসের মডেল করার চেষ্টা করা একটি দুর্বল পছন্দ (আপনি ল্যাটিন ব্যবহার করা থেকে ভাল )। একই ধরণের কল অফ চেইনের একাধিক সম্ভাব্য বৈধ পার্সিংগুলি থাকাকালীন এটি বিভ্রান্তি ও অবাক করে দেয় । এপিআই-তে থাকা কোনওটিই ভাল জিনিস নয়।

এই API টি প্রকাশের চেয়ে এসকিউএল এর আরও অনেকগুলি অংশ রয়েছে। যোগদান (তাদের যে কোনও অজস্র ফর্মের মধ্যে) উদাহরণস্বরূপ উল্লেখযোগ্যভাবে অনুপস্থিত। সাবকিউরিজ ( foo in (select id from bar)), ইউনিয়ন এবং গোষ্ঠীগুলি হ'ল প্রায়শই ব্যবহৃত হয়। যৌক্তিকতার জটিল গ্রুপিংগুলি কোনও স্বজ্ঞাত উপায়ে উপস্থিত বলে মনে হয় না।

যদি কেউ এই এপিআইটি ব্যবহার করে লিখছেন এবং তারপরে সন্ধান পেয়েছেন যে এপিআই পছন্দসই কোয়েরিটি প্রকাশ করতে সক্ষম নয় তবে উল্লেখযোগ্য সময় নষ্ট হবে। অ্যাপ্লিকেশনটিতে কোয়েরি করার জন্য মিশ্র শৈলীগুলি ব্যবহার করা ভাল নয় (এই এপিআইয়ের সহজ প্রশ্নগুলি, কাঁচা এসকিএল-তে জটিল) - এবং শেষ পর্যন্ত যেটি আরও বেশি প্রকাশিত তা ব্যবহার করা হবে।

প্রোগ্রামিং বিস্তৃত থাকাকালীন, ইংরেজি সাবলীলতা নেই। এমনকি "এসকিউএল এর মতো" ভাষার সীমাবদ্ধতার পরেও কোনও স্থানীয় স্পিকার কীভাবে কিছু পড়তে পারে এবং দ্বিতীয় বা তৃতীয় ভাষা হিসাবে ইংরেজী ভাষা রয়েছে এমন কিছু রয়েছে uan

ইংরেজির স্বার্থে এপিআইতে অপ্রয়োজনীয় অপ্রয়োজনীয়তা রয়েছে। বিশেষ করে equal()বনাম equals()একই জিনিস করছেন। যদিও আমি এটি সম্পর্কে নিশ্চিত নই, আমি বিশ্বাস করি যে is()এটি মিলে যাওয়া ইংরেজির নিকটবর্তী হওয়ার জন্য একটি অপশন যুক্ত। আড্ডায় রুবিতে পদ্ধতিগুলির অপ্রয়োজনীয়তা সম্পর্কে আমার রেটিং শোনার জন্য আমি কাউকে স্বাগত জানাই - একই ভুল করবেন না।

আপনি বসতে চান এবং আপনি ব্যবহার করতে সক্ষম হতে চান এমন প্রশ্নের একটি বিস্তৃত উদাহরণ সেট লিখুন। এই সমস্ত উদাহরণ কে আপনি দ্বি-দ্বিবিহিত পদ্ধতিতে পরিচালনা করবেন তা নির্ধারণ করুন যা তাদের নিজের প্রশ্নের চেয়ে কম জটিল। যদি আপনি না পারেন, তবে এপিআই লেখার পথে নেমে যাওয়া সার্থক কিনা তা বিবেচনা করুন। এসকিউএল হ'ল এটি আজ যেখানে রয়েছে (এটি নিখুঁত নয়, তবে আমি এর চেয়ে ভাল কিছু খুঁজে পাইনি) কয়েক দশক ধরে পরিশোধিত হয়েছে।

আরএফসি 1925 - দ্বাদশ নেটওয়ার্কিংয়ের সত্যতা

(12) প্রোটোকল ডিজাইনে, যখন যোগ করার মতো কিছুই থাকে না তখন পরিপূর্ণতা পৌঁছে যায়, তবে যখন কিছুই ছিনিয়ে নিতে থাকে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.