diff --git a/src/LINQ/RQL/NodeMap.vb b/src/LINQ/RQL/NodeMap.vb
new file mode 100644
index 0000000..4ca62e4
--- /dev/null
+++ b/src/LINQ/RQL/NodeMap.vb
@@ -0,0 +1,10 @@
+Imports Microsoft.VisualBasic.Data.IO
+
+'''
+''' A descriptor of the specific resource file
+'''
+Public Class NodeMap
+
+ Public Property resources As List(Of String)
+
+End Class
diff --git a/src/LINQ/RQL/RQL.vbproj b/src/LINQ/RQL/RQL.vbproj
index 74da151..de58c4e 100644
--- a/src/LINQ/RQL/RQL.vbproj
+++ b/src/LINQ/RQL/RQL.vbproj
@@ -243,6 +243,8 @@
+
+
True
@@ -287,6 +289,10 @@
{c1413834-6eba-4668-b3e4-9dfa1edb9a5d}
HDSPack
+
+ {ae10f033-1ee2-44ef-af06-f1c81411d069}
+ graph-netcore5
+
{ef075a21-793b-45ed-9c38-ad5d04744aec}
Core
diff --git a/src/LINQ/RQL/Resource.vb b/src/LINQ/RQL/Resource.vb
new file mode 100644
index 0000000..924ef0a
--- /dev/null
+++ b/src/LINQ/RQL/Resource.vb
@@ -0,0 +1,88 @@
+Imports System.IO
+Imports Microsoft.VisualBasic.ComponentModel.Ranges
+Imports Microsoft.VisualBasic.Data.GraphTheory
+Imports Microsoft.VisualBasic.DataStorage.HDSPack.FileSystem
+
+'''
+''' Resource query language
+'''
+Public Class Resource : Implements IDisposable
+
+ ReadOnly buf As StreamPack
+ ReadOnly index As Trie(Of NodeMap)
+
+ Private disposedValue As Boolean
+
+ Sub New(res As StreamPack)
+ buf = res
+ End Sub
+
+ Public Function Add(key As String, data As Byte()) As Boolean
+ Dim tokens As String() = Strings.LCase(key).Split
+ Dim map As String = key.MD5
+ Dim path As String = $"/pool/{map.Substring(4, 2)}/{map.Substring(16, 6)}/{map}"
+
+ For Each si As String In tokens
+ Dim v = index.Add(key)
+ Dim page As NodeMap = v.data
+
+ Call page.resources.Add(map)
+ Next
+
+ Dim file As Stream = buf.OpenFile(path, FileMode.OpenOrCreate, FileAccess.Write)
+ Call file.Write(data, Scan0, data.Length)
+ Call file.Flush()
+ Call file.Dispose()
+
+ Return True
+ End Function
+
+ Public Function [Get](query As String) As IEnumerable(Of NumericTagged(Of String))
+ Dim tokens As String() = Strings.LCase(query).Split
+ Dim maps As New Dictionary(Of String, Double)
+
+ For Each si As String In tokens
+ Dim v = index.Find(si)
+ Dim f As Double = 0.5
+
+ If v.success Then
+ f = 1
+ End If
+
+ For Each map As String In v.child.data.resources
+ maps(map) += f
+ Next
+ Next
+
+ Return From a
+ In maps
+ Select o = New NumericTagged(Of String)(a.Value, a.Key)
+ Order By o.tag Descending
+ End Function
+
+ Protected Overridable Sub Dispose(disposing As Boolean)
+ If Not disposedValue Then
+ If disposing Then
+ ' TODO: 释放托管状态(托管对象)
+ Call buf.Dispose()
+ End If
+
+ ' TODO: 释放未托管的资源(未托管的对象)并重写终结器
+ ' TODO: 将大型字段设置为 null
+ disposedValue = True
+ End If
+ End Sub
+
+ ' ' TODO: 仅当“Dispose(disposing As Boolean)”拥有用于释放未托管资源的代码时才替代终结器
+ ' Protected Overrides Sub Finalize()
+ ' ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中
+ ' Dispose(disposing:=False)
+ ' MyBase.Finalize()
+ ' End Sub
+
+ Public Sub Dispose() Implements IDisposable.Dispose
+ ' 不要更改此代码。请将清理代码放入“Dispose(disposing As Boolean)”方法中
+ Dispose(disposing:=True)
+ GC.SuppressFinalize(Me)
+ End Sub
+End Class