angle-left null F# Data - Tạo ra dữ liệu có cấu trúc cho công dân
Trang chủ

18/05/2020 03:28

(data.gov.vn) Mặc dù có nhiều nỗ lực phân loại dữ liệu nhưng hầu hết dữ liệu vẫn có sẵn ở các định dạng có cấu trúc, dữ liệu ở dưới dạng tệp CSV, các dịch vụ web services giao tiếp bằng JSON và hầu hết các tệp XML được sử dụng trong thực tế không chứa đựng lược đồ

Thông tin duy nhất được tạo ra là một tập hợp các ví dụ, chẳng hạn như phản hồi của máy chủ trong tài liệu hoặc tệp dữ liệu từ các năm trước. Dẫn đến sự truy cập để sử dụng các ngôn ngữ trong máy gặp nhiều khó khăn. Chỉ có một vài ngôn ngữ cung cấp cơ chế để nhập lược đồ từ các nguồn dữ liệu ngoài dưới dạng các loại dữ liệu.

          Bài viết này sẽ trình bày Dữ liệu F# Data - một thư viện nguồn mở của các nhà cung cấp loại F# Data để truy cập dữ liệu XML, CSV và JSON dựa trên các tài liệu mẫu do người dùng cung cấp.

Nhà cung cấp type cấu trúc

          Trong phần này, chúng tôi trình bày các nhà cung cấp type cấu trúc từ Dữ liệu F# Data (http://fsharp.github.io/FSharp.Data) trở thành thư viện chuẩn để thu thập dữ liệu trong F#.

          JSON dựa trên các cấu trúc dữ liệu được sử dụng trong JavaScript và sử dụng sáu loại (Number, String, Boolean, Array, Object và Null). Đoạn mã sau đây là một ví dụ về tài liệu JSON:

[{"name" : null, "age" : 23},

{"name" : "Alexander", "age" : 1.5},

{"name" : "Tomas"} ]

          Trong ngôn ngữ chức năng tĩnh, các tài liệu JSON có thể được biểu diễn bằng kiểu dữ liệu đại số. Khi xử lý tài liệu, chúng tôi sử dụng mô hình tích hợp để trích xuất các giá trị mà chúng tôi dự kiến sẽ có sẵn trong tài liệu. Giả sử từ định dạng trên, chúng tôi có thể in tên của tất cả những người trong tài liệu như sau:

match data with

| Array items →

for item in items do

match item with

| Object prop → print (Map.find prop "name")

| _ → failwith "Incorrect format"

| _ → failwith "Incorrect format"

          Đầu vào của mã này có định dạng nhất định (mảng các đối tượng có trường “name”) và bị lỗi nếu đầu vào của mã không phù hợp.

          Đoạn mã trên yêu cầu một cấu trúc cố định (mảng các bản ghi với một lĩnh vực nhất định), nó được viết bằng cách sử dụng các tóm tắt đã được thiết kế để cho phép xử lý các cấu trúc không cố định (chẳng hạn như mô hình kết hợp).

          Giả sử rằng people.json chứa dữ liệu và dữ liệu trên là một chuỗi chứa thông tin có cùng định dạng, chúng ta có thể viết lại mã bằng cách sử dụng JsonProvider từ Dữ liệu F# Data như sau

type People = JsonProvider<"people.json">

let items = People.Parse(data)

for item in items do

printf "%s" item.Name

Option.iter (printf "%d") item.Age

Tham số “people.json” được giải quyết tĩnh tại thời gian biên dịch (nó phải là hằng số). Nó được chuyển đến JsonProvider chứa mã (được thực thi tại thời gian biên dịch) để xây dựng một đặc tả của kiểu People và chuyển nó trở lại biên dịch F#. Loại thông tin này cũng có sẵn cho phép tạo công cụ nâng cao như hoàn thành mã.

          Nhà cung cấp type cũng chỉ định mã sẽ được thực thi trong thời gian chạy thay thế cho kiểu dữ liệu item.Name và các hoạt động khác. Để chứa các nguồn dữ liệu ngoài với số lượng lớn các type (chẳng hạn như Freebase và WorldBank trong F# Data), thì Nhà cung cấp type cho phép xây dựng các type đã xóa - các type chỉ tồn tại ở giai đoạn kiểm tra type, và biến mất trong quá trình biên dịch, ví dụ như: item.Name được biên dịch thành item.GetStringProperty(“name”).

3. Loại hệ thống cho cấu trúc dữ liệu

          Thuật toán suy luận kiểu dữ liệu có cấu trúc dựa trên mối quan hệ phụ. Khi suy luận kiểu một tài liệu được chỉ định cụ thể, chúng tôi suy ra loại cụ thể nhất các type của giá trị riêng lẻ, chẳng hạn như các hàng CSV hoặc các nút JSON, sau đó tìm loại siêu giá trị phổ biến trong một tập dữ liệu nhất định. Các loại cấu trúc được định nghĩa như sau:

𝜏 = | null | int | decimal | float | string | bool

𝜏] | 𝜏1 + + 𝜏𝑛

𝜈𝑜𝑝𝑡 { 𝛿1𝜈1: 𝜏1, … , 𝛿𝑛𝜈𝑛: 𝜏𝑛 }

          Loại (type) có thể là một trong những loại type nguyên thủy (numeric, string, Boolean), null và type hàng đầu (cần thiết cho giá trị null và khi type không được biết - ví dụ: danh sách trống).

          Ba trường hợp cuối cùng xác định một loại tập hợp, loại unions (không nhãn) và loại bản ghi bao gồm tên tùy chọn 𝜈 (được sử dụng bởi các phần tử XML có tên, nhưng bị bỏ qua bởi JSON, nơi các bản ghi không được gắn nhãn) cùng với một tập hợp các lĩnh vực. Mỗi lĩnh vực có một tên 𝜈𝑖 và một loại 𝜏𝑖 và một chú thích 𝛿𝑖 chỉ định xem trường có phải là tùy chọn không hay trường đó luôn có mặt.

Phân nhóm quan hệ:

          · Các loại số tương ứng với loại F# là kiểu số chính xác nhất. Trong thời gian chạy, int có thể được chuyển đổi thành số thập phân.

         Giá trị null value có giá trị cho tất cả các loại kết hợp, loại bản ghi và loại chuỗi (hệ thống loại .NET), nhưng không có giá trị với nhiều loại số nguyên thủy.

         · Loại bản ghi là một kiểu con của loại bản ghi khác nếu nó chứa tất cả các trường của nó cùng với các trường tùy chọn bổ sung. Type siêu phổ biến của hai bản ghi là một bản ghi với các trường duy nhất cho một hoặc một bản ghi khác là tùy chọn.

          · Có một loại trên cùng, nhưng không có loại dưới cùng duy nhất..

          Ví dụ: mẫu dưới đây là danh sách các bản ghi với trường name (có thể là null) và trường age tùy chọn là một trong hai trường int hoặc decimal. Nhà cung cấp type ánh xạ type suy ra sau đây F# types:

type Entity1 = list

type Entity2 =

abstract Name : string

abstract Age : option

          Bản ghi được ánh xạ tới một loại với những đặc tính được đặt tên. Các trường (fields) tùy chọn được ánh xạ tới các loại (types) tùy chọn và sau đó có thể được xử lý bằng cách sử dụng mô hình kết hợp hoặc sử dụng chức năng như Option.iter được sử dụng trước đó.

          Đặc tính. Loại (type) được tạo dựa trên một tài liệu mẫu được sử dụng để đọc các tài liệu khác có cấu trúc tương tự. Truy cập vào một trường của tài liệu đó có thể thất bại khi tài liệu không tương ứng với cấu trúc được suy luận (ví dụ. trường bị thiếu hoặc chứa giá trị không thể chuyển đổi thành loại mong muốn). Trong thực tế, điều này được thực hiện để lập trình với các định dạng XML, CSV và JSON.

Kết luận

          Bài viết này đã đưa ra một tổng quan ngắn gọn của các loại cấu trúc trong thư viện dữ liệu F# Data giúp đơn giản hóa việc thực hiện các tài liệu dựa trên CSV, CML và JSON. Các tài liệu này thường thiếu lược đồ, điều này gây khó khăn cho việc tích hợp chúng vào các ngôn ngữ tĩnh. Cách tiếp cận đơn giản nhất là suy ra lược đồ từ tài liệu mẫu, điều này mang lại cho chúng ta một thuộc tính an toàn, phục hồi càng nhiều lần type càng tốt.

Các công việc liên quan

          Thư viện dữ liệu F# Data kết hợp hai khía cạnh được xem xét riêng. Đầu tiên là tích hợp các nguồn dữ liệu ngoài vào ngôn ngữ type tĩnh. LINQ sử dụng thế hệ mã và Links sử dụng nguồn dữ liệu cụ thể (cơ sở dữ liệu).

          Thành phần thứ hai là kiểu suy luận cho các định dạng có cấu trúc. Một hệ thống liên quan được thiết kế để làm việc trên các tập dữ liệu mẫu quy mô lớn và sử dụng nhiều phương pháp phỏng đoán. Cách tiếp cận của chúng tôi đơn giản hơn, nhưng hoạt động tốt đối với các mẫu nhỏ hơn thường có sẵn khi gọi các dịch vụ dựa trên REST hoặc làm việc với dữ liệu XML và CSV.

          1. Links: lập trình web mà không cần tầng. Ezra Cooper, Sam Lindley, Philip Wadler, và Jeremy Yallop. In the proceedings of FMCO 2006, LNCS 4709.

          2. Nhập bộ dữ liệu JSON lớn. Dario Colazzo, Giorgio Ghelli, Carlo Sartiani, In the proceedings of XLDI 2012.

          3. F#3.0 - Strongly-Typed Language Support for Internet-Scale Information Sources. Don Syme et al., Technical Report, MSRTR-2012-101, Microsoft Research, 2012.

      4. LINQ: reconciling object, relations and XML in the .NET framework. Erik Meijer, Brian Beckman and Gavin Bierman. In the proceedings of SIGMOD 2006.

theo http://qcvn109.gov.vn/cong-nghe/f-data---tao-ra-du-lieu-co-cau-truc-cho-cong-dan.html


Tin xem nhiều

placeholder image

Các câu hỏi để kiểm tra mức độ an toàn khi chia sẻ dữ liệu