基于關鍵字主次分類的xml查詢方法
【專利摘要】本發(fā)明公開了一種基于關鍵字主次分類的XML查詢方法,通過對XML文檔上進行數(shù)值節(jié)點索引、名稱節(jié)點索引、實體E?R索引構建和對查詢關鍵字進行主次分類,并對查詢表達式的查詢語法結構、關鍵字的主次分類、操作符及其優(yōu)先級方面進行了規(guī)范,用戶可以利用自己掌握的關鍵字信息準確表達用戶查詢意圖,在查詢的準確性和有效性上相比于傳統(tǒng)的關鍵字查詢都有明顯的改進。
【專利說明】
基于關鍵字主次分類的XML查詢方法
技術領域
[0001]本發(fā)明涉及一種基于關鍵字主次分類的XML查詢方法,屬于信息查詢技術領域。
【背景技術】
[0002]XML是可擴展標記語言的簡稱,伴隨越來越多的Web應用,系統(tǒng)平臺間的數(shù)據(jù)交換,信息系統(tǒng)中Web信息的發(fā)布以及集成等諸多領域都需要XML數(shù)據(jù),網(wǎng)絡中已涌現(xiàn)了大量符合XML規(guī)范的數(shù)據(jù),XML技術在Web應用中不可或缺。因此,對于XML數(shù)據(jù)的有效檢索將成為研究的一個重要方向。目前,XML數(shù)據(jù)檢索方法主要有:結構化查詢和關鍵字查詢。結構化查詢最大的優(yōu)點就是可以根據(jù)用戶給出的查詢語言表達式獲得精確的查詢結果,但是它并不適用于普通用戶,原因主要在于:用戶必須學習與查詢語言相關的語法機制,增加了用戶使用的難度,制約了用戶的使用習慣;另外,即便用戶掌握了相關的語法機制,如果對要查詢的XML文檔的數(shù)據(jù)結構信息不了解,讓用戶給出正確的符合結構化查詢語法機制的語句是比較困難的。在傳統(tǒng)的信息檢索領域,關鍵字查詢方式是比較容易被普通用戶接受的,它在數(shù)據(jù)查詢中具有簡單、便利的特點,因而可以將信息檢索領域中關鍵字查詢的優(yōu)點應用到XML數(shù)據(jù)的查詢處理中。傳統(tǒng)信息檢索中,在用戶給出查詢關鍵字時,一般返回的是整個HTML文檔,而在XML關鍵字查詢返回的僅是包含關鍵字的一個XML文檔片段。相比結構化查詢方式,XML關鍵字查詢方式對用戶的要求不高,不需要用戶掌握復雜的查詢語法,因此它是一種比較方便的查詢方式。
[0003 ]但現(xiàn)有XML關鍵字查詢由于對XML文檔自身語義及用戶查詢意圖獲取的不足,往往導致大量與用戶期望查詢不一致或冗余的信息。
【發(fā)明內容】
[0004]本發(fā)明的目的在于克服現(xiàn)有技術中的不足,提供一種基于關鍵字主次分類的XML查詢方法,保證用戶在不了解XML數(shù)據(jù)組織結構的情況下也能正確表達查詢意圖,提高查詢的準確性和效率。
[0005]為實現(xiàn)上述目的,本發(fā)明所采用的技術方案是:一種基于關鍵字主次分類的XML查詢方法,包括如下步驟:
[0006]步驟一:根據(jù)E-R模型對XML文檔進行有效的索引機制建立,包括:數(shù)值節(jié)點索引建立、名稱節(jié)點索引建立、實體E-R索引建立;建立完的整個實體E-R索引以虛線為界,分為B+樹和鏈表兩個部分;B+樹中存儲的是實體節(jié)點Dewey編碼和指向鏈表的指針,而鏈表中索引項中存儲的則是與實體節(jié)點相關的屬性節(jié)點Dewey碼以及其屬性節(jié)點標簽和其數(shù)值信息;
[0007]步驟二:對用戶查詢表達式的合法性判斷,當用戶輸入查詢表達式符合語法規(guī)則之后,從中分別獲取主關鍵字分組和次關鍵字分組,通過節(jié)點所在的節(jié)點三元式以及節(jié)點的名稱節(jié)點索引或數(shù)值節(jié)點索引得到每一個關鍵字分組的Dewey碼集合;
[0008]步驟三:根據(jù)得到的每個關鍵字分組的Dewey碼集合中的節(jié)點及實體B+樹索引,確定每個次關鍵字分組及主關鍵字分組中關鍵字節(jié)點所對應的實體E-R子樹;
[0009]步驟四:據(jù)查詢表達式中的操作符執(zhí)行操作運算,過濾操作符享有最高優(yōu)先級,交集或并集運算次之;
[0010]步驟五:確定最終結果子樹:主次實體子樹應在滿足過濾條件的情況下,最終進行結果的返回,主實體子樹應是對次實體子樹的包含。
[0011]步驟一中所述數(shù)值節(jié)點索引是用哈希表來存儲每個數(shù)值節(jié)點的節(jié)點信息,鏈地址方法處理節(jié)點存儲位置的沖突,每一個索引項包含節(jié)點的Dewey碼及本位屬性節(jié)點名稱。
[0012]步驟一中所述名稱節(jié)點索引是以哈希表結構來存儲節(jié)點信息,鏈地址方法處理節(jié)點沖關;
[0013]每個存儲單元包含節(jié)點Dewey碼、標記該節(jié)點是屬于連接節(jié)點、屬性節(jié)點、還是實體節(jié)點的標記符,以及該節(jié)點所對應的本位實體節(jié)點或是最近祖先實體節(jié)點的信息。
[0014]步驟一中所述實體E-R索引是以B+樹結構存儲文檔中實體節(jié)點的相關信息,包括該實體節(jié)點的Dewey編碼以及實體節(jié)點所在實體E-R子樹中各個屬性節(jié)點Dewey碼及標簽信息。
[0015]步驟二的具體方法為:
[0016]步驟2-1:根據(jù)查詢語法結構規(guī)則,檢查查詢用例表達式的合法性:
[0017]主關鍵字的每個分組“[]”中,不能出現(xiàn)單引號標記的數(shù)值節(jié)點;
[0018]主次關鍵字分組之間需要“I ”過濾操作符進行分隔;
[0019]次關鍵字分組“[]”中只能是對一個屬性或實體的描述,在一個次關鍵字分組中不能出現(xiàn)多個非數(shù)值節(jié)點;
[0020]當用戶輸入的表達式符合語法規(guī)則,則進行查詢表達式解析;否則,輸出提示;
[0021]步驟2-2:當用戶輸入查詢表達式符合語法規(guī)則之后,算法需要解析用戶輸入的查詢表達式,從中分別獲取主關鍵字分組和次關鍵字分組,將其存入不同的數(shù)組中:對于每個次關鍵字分組,則需要根據(jù)所有的關鍵字節(jié)點對應的索引機制得到次關鍵字分組的Dewey碼集合,不論次關鍵字組中的節(jié)點屬于名稱節(jié)點還是數(shù)值節(jié)點,都可以通過節(jié)點所在的節(jié)點三元式以及節(jié)點的名稱節(jié)點索引或數(shù)值節(jié)點索引得到每一個關鍵字分組的Dewey碼集入口 ο
[0022]與現(xiàn)有技術相比,本發(fā)明所達到的有益效果是:本發(fā)明綜合考慮文檔自身語義及用戶查詢語義,保證用戶在不了解XML數(shù)據(jù)組織結構、不掌握復雜查詢語法的情況下,可以利用自身掌握的常識性信息,構造相應的查詢語法,正確表達查詢意圖,提高查詢的準確性和效率。
【附圖說明】
[0023]圖1是本發(fā)明的算法執(zhí)行流程圖。
[0024]圖2是XML文檔樹結構圖。
[0025]圖3是E-R索引結構圖。
[0026]圖4是示例處理步驟圖。
【具體實施方式】
[0027]本發(fā)明是針對于XML關鍵字查詢時,根據(jù)關鍵字所表達的是查詢結果或是查詢限制條件,對用戶的查詢關鍵字分為兩類:表明用戶查詢結果的關鍵字是主關鍵字,表明查詢中限制信息的關鍵字是次關鍵字,在此分類基礎上,提出一種新的基于關鍵字主次分類的查詢表達式,構造相應的查詢語法,使用戶在不了解XML結構、不掌握復雜查詢語法的前提下可以利用自身掌握的常識性信息,對查詢用例中的關鍵字以明確的查詢語義。下面對本發(fā)明的構思和本發(fā)明所涉及的基本信息進行概述。
[0028]首先根據(jù)E-R模型(E-R模型由實體、屬性及關系構成,實體是對現(xiàn)實世界擁有相同信息的對象的抽象表示;屬性是對實體所包含信息的抽象)的思想,將XML文檔的各個節(jié)點進行分類處理,主要類型有四種:XML樹中的葉子節(jié)點稱為數(shù)值節(jié)點;若一個XML非葉子節(jié)點有且僅有一個數(shù)值子節(jié)點時,該節(jié)點被稱為屬性節(jié)點;若一個XML非葉子節(jié)點存在至少一個屬性子節(jié)點時,該節(jié)點則是實體節(jié)點;若一個XML非葉子節(jié)點的子節(jié)點中既不存在屬性節(jié)點也不存在數(shù)值節(jié)點,該節(jié)點為連接節(jié)點。同時完成對XML文檔樹進行索引結構的創(chuàng)建,為用戶進行XML關鍵字查詢做好預處理準備。
[0029]其次用戶在進行查詢時雖然不能了解詳細的XML結構信息,但是憑借常識性信息,還是可以把握一些可客觀信息。比如:屬性值與屬性之間的對應關系,屬性與實體節(jié)點之間的對應關系或者給出的關鍵字節(jié)點是一個實體節(jié)點還是一個數(shù)值節(jié)點等等。因此,可以將關鍵字延伸至一個由關鍵字組成的表達式,并且為了準確地獲取用戶給出的關鍵字查詢語義,對用戶給出的關鍵字進行主次分類,主關鍵字表明用戶查詢結果,次關鍵字表明用戶查詢限制條件,并通過相關的語法規(guī)范機制構建查詢表達式,使用戶的查詢意圖及查詢語義更加明確。其查詢表達式語法如下:
[0030]查詢語法由三部分組成,主關鍵字表達式、次關鍵字表達式、操作符。主關鍵字表達式一般表示的是返回用戶期望信息的,而次關鍵字表達式則是指明查詢約束條件的;其查詢語法結構如下:
[0031 ] PSO=(Primary_keyword_express1n,Secondary_keyword_express1n,opE-Rator) ;
[0032]Primary_keyword_express1n的形式為“[keyword],,;
[0033]Secondary_keyword_express 1n的形式為 “[keyword “keyword” ]” Uorfl“[keyword“keyword” ],,;
[0034]主關鍵字和次關鍵字表達式之間用“I ”符號進行分隔,兩種關鍵字表達式都是由O個或多個關鍵字分組組成,位于“[]”內。不同的主關鍵字表達式之間是并(U)的關系,不同的次關鍵字表達式之間存在并(u )和交(η )兩種關系,每一個關鍵字組中,關鍵字間由空格分開,被單引號標記的是值節(jié)點,其他的均為元素節(jié)點。
[0035]基于關鍵字主次分類表達式的查詢用例可以是由傳統(tǒng)關鍵字組成的查詢用例,也可以是由對關鍵字進行分類并加入操作運算符的查詢,這完全取決于用戶對于關鍵字信息的了解程度。并且它也沒有嚴格規(guī)定用戶使用語法,使得這種方式的查詢更適用于在XML這種數(shù)據(jù)結構中。
[0036]然后根據(jù)明確的XML查詢語義表達式和已經(jīng)構造好的索引結構XML文檔樹確定每個主關鍵字分組及次關鍵字分組中關鍵字節(jié)點所對應的實體E-R子樹。
[0037]最后,根據(jù)查詢表達式中的操作符執(zhí)行操作優(yōu)先級的過濾。確定最終結果子樹。主次實體子樹應在滿足過濾條件的情況下,最終進行結果的返回。主實體子樹應是對次實體子樹在一定程度上的包含。其操作符定義及操作優(yōu)先級如下:
[0038](I)交集(η)操作符
[0039]交集操作符在關鍵字主次分類表達式查詢用例中是以“η”作標識,它需要和過濾操作符一起使用,返回的是與交集操作符連接的兩個次關鍵字分組所匹配的次實體子樹。然后主實關鍵字組對應的主實體子樹根據(jù)交集操作返回的結果作為查詢所要返回結果的一個篩選條件。
[0040](2)并集(U)操作符
[0041]并集操作符在關鍵字主次分類表達式查詢用例中以“U”作為標識,同樣需要與過濾操作符一起使用,返回至少與并集操作符連接的兩個關鍵字分組中的一個所關聯(lián)的實體子樹。并集操作符是比交集操作符更寬松的查詢限制條件,因為它僅需要主實體子樹關聯(lián)并集操作符兩個子關鍵字分組中的一個就可以。
[0042](3)過濾(I)操作符
[0043]過濾操作符在關鍵字主次分類表達式查詢用例中以“I ”作為標識,它將主關鍵字對應的主實體子樹與次關鍵字對應的次實體子樹相關聯(lián)。如果主實體子樹與任何次實體子樹都不存在關聯(lián),那么過濾操作符就會過濾這次的查詢結果;只有當主實體子樹與次實體子樹存在一定關聯(lián)性的時候,查詢結果才會被保留。
[0044]基于關鍵字主次分類表達式的操作符的優(yōu)先級是有一定要求的,過濾操作符有著最高的優(yōu)先級,并集和交集操作符次之,兩者優(yōu)先級等同。查詢用例中可以包含多個主關鍵字分組,這些主關鍵字分組之間是沒有關聯(lián)、相互獨立的,它們可以被分解為單個主關鍵字分組的表達式。例如:表達式[ΡΚ1][ΡΚ2] I [SK]就等價于兩個獨立的表達式[PKI] I [SKHP[ΡΚ2]I[SK]。
[0045]下面結合附圖對本發(fā)明作詳細描述,如圖1所示,基于關鍵字主次分類的XML查詢方法,具體包括以下幾個步驟:
[0046]步驟1:根據(jù)E-R模型對XML文檔進行有效的索引機制建立,建立完的整個實體E-R索引以虛線為界,分為B+和鏈表兩個部分;B+樹中存儲的是實體節(jié)點Dewey編碼和指向鏈表的指針,而鏈表中索引項中存儲的則是與實體節(jié)點相關的屬性節(jié)點Dewey碼以及其屬性節(jié)點標簽和其數(shù)值信息。具體步驟方法如下:
[0047]步驟1-1:數(shù)值節(jié)點索引建立,數(shù)值節(jié)點索引是一個用哈希表來存儲每個數(shù)值節(jié)點的節(jié)點信息,鏈地址方法處理節(jié)點存儲位置的沖突。每一個索引項包含節(jié)點的Dewey碼及本位屬性節(jié)點名稱;
[0048]步驟1-2:名稱節(jié)點索引建立,名稱節(jié)點索引同樣是以哈希表結構來存儲節(jié)點信息,鏈地址方法處理節(jié)點沖突,每個存儲單元包含節(jié)點Dewey碼、標記該節(jié)點是屬于連接節(jié)點、屬性節(jié)點、還是實體節(jié)點的標記符(分別用0、1、2標記),以及該節(jié)點所對應的本位實體節(jié)點或是最近祖先實體節(jié)點的信息;
[0049]步驟1-3:實體E-R索引建立,實體E-R索引是P&SCE算法的關鍵索引,它以B+樹結構存儲文檔中實體節(jié)點的相關信息,包括該實體節(jié)點的Dewey編碼以及實體節(jié)點所在實體E-R子樹中各個屬性節(jié)點Dewey碼及標簽信息。
[0050]步驟2:對用戶查詢表達式的合法性判斷和表達式的解析,具體步驟方法如下:
[0051 ]步驟2-1:根據(jù)查詢語法(PKO)結構規(guī)則,檢查查詢用例表達式的合法性。主關鍵字的每個分組“[]”中,不能出現(xiàn)單引號標記的數(shù)值節(jié)點。主次關鍵字分組之間需要“I”過濾操作符進行分隔,次關鍵字分組“[]”中只能是對一個屬性或實體的描述,在一個次關鍵字分組中不能出現(xiàn)多個非數(shù)值節(jié)點。如果用戶輸入的表達式不符合語法規(guī)則,會提示用戶;
[0052]步驟2-2:當用戶輸入查詢表達式符合語法規(guī)則之后,算法需要解析用戶輸入的查詢表達式,從中分別獲取主關鍵字分組和次關鍵字分組,將其存入不同的數(shù)組中。對于每個次關鍵字分組,則需要根據(jù)所有的關鍵字節(jié)點對應的索引機制得到次關鍵字分組的Dewey碼集合。不論次關鍵字組中的節(jié)點屬于名稱節(jié)點還是數(shù)值節(jié)點,都可以通過節(jié)點所在的節(jié)點三元式以及節(jié)點的名稱節(jié)點索引或數(shù)值節(jié)點索引得到每一個關鍵字分組的Dewey碼集入口 ο
[0053]步驟3:根據(jù)得到的每個關鍵字分組的Dewey碼集合中的節(jié)點及實體B+樹索引,確定每個次關鍵字分組及主關鍵字分組中關鍵字節(jié)點所對應的實體E-R子樹。
[0054]步驟4:據(jù)查詢表達式中的操作符執(zhí)行操作運算,上文中對于操作符處理以及優(yōu)先級已經(jīng)給出了明確的規(guī)則,過濾操作符享有最高優(yōu)先級,交集(n )or并集(u )運算次之。因此,按照查詢表達式從左到右的操作符號進行操作,考慮實體子樹之間的關聯(lián)關系。
[0055]步驟5:確定最終結果子樹。主次實體子樹應在滿足過濾條件的情況下,最終進行結果的返回。主實體子樹應是對次實體子樹在一定程度上的包含。這其中的運算需要借助實體B+樹索引機制,最終返回相關節(jié)點信息。
[0056]下面結合具體實施例對本發(fā)明作進一步描述,以下實施例僅用于更加清楚地說明本發(fā)明的技術方案,而不能以此來限制本發(fā)明的保護范圍。
[0057]如一個XML文檔樹結構如圖2所示,查詢實例為:uQC= [team] | [name“LakE-Rs” ] (?[pIayE-R“Kobe”]”,
[0058]stepl:構建XML文檔的E-R索引結構,如圖3所示。
[0059]step3:對于查詢用例QC,算法P&SCE檢查后認為其為有效查詢表達式。
[0060]Step3:獲取主次關鍵字分組以及操作符,然后匹配關鍵字節(jié)點。對于QC中主關鍵字分組中只有“team”關鍵字,次關鍵字分組中有“name”、“LakE-Rs”、“playE-R”、“Kobe”四個關鍵字。
[0061 ] Dewey (team) = {0.0.2.0,0.0.2.1,....,0.0.2.6}
[0062]Dewey (name) = {0.0.0,0.0.2.0.0,0.0.2.0.4.0.0,....}
[0063]Dewey(LakE-Rs) = (0.0.2.0.0.0}
[0064]Dewey(playE-R) = {0.0.2.0.4.0,0.0.2.0.4.1,0.0.2.0.4.2,……}
[0065]Dewey(Kobe) = (0.0.2.0.4.0.0.0}
[0066]Step4:從名稱節(jié)點索引以及數(shù)值節(jié)點索引中,算法查找每個關鍵字對應的實體子樹節(jié)點Dewey碼集合??芍琫st(team) = {0.0.2.0,0.0.2.1,....,0.0.2.6},est(name“LakE-Rs” ) = (0.0.2.0},est(playE-R“Kobe” ) = (0.0.2.0.4.0}
[0067]Step5:根據(jù)操作運算符ops執(zhí)行操作運算,est(team) | est (name “LakE-Rs”)執(zhí)行下的結果是以同位關聯(lián)于team(0.0.2.0)為根的實體子樹,再考慮交集(n)操作,很顯然team(0.0.2.0)為根的實體子樹高位關聯(lián)于以playE-R(0.0.2.0.4.0)為根的實體子樹。
[0068]以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明技術原理的前提下,還可以做出若干改進和變形,這些改進和變形也應視為本發(fā)明的保護范圍。
【主權項】
1.基于關鍵字主次分類的XML查詢方法,其特征在于,包括如下步驟: 步驟一:根據(jù)E-R模型對XML文檔進行有效的索引機制建立,包括:數(shù)值節(jié)點索引建立、名稱節(jié)點索引建立、實體E-R索引建立;建立完的整個實體E-R索引以虛線為界,分為B+樹和鏈表兩個部分;B+樹中存儲的是實體節(jié)點Dewey編碼和指向鏈表的指針,而鏈表中索引項中存儲的則是與實體節(jié)點相關的屬性節(jié)點Dewey碼以及其屬性節(jié)點標簽和其數(shù)值信息; 步驟二:對用戶查詢表達式的合法性判斷,當用戶輸入查詢表達式符合語法規(guī)則之后,從中分別獲取主關鍵字分組和次關鍵字分組,通過節(jié)點所在的節(jié)點三元式以及節(jié)點的名稱節(jié)點索引或數(shù)值節(jié)點索引得到每一個關鍵字分組的Dewey碼集合; 步驟三:根據(jù)得到的每個關鍵字分組的Dewey碼集合中的節(jié)點及實體B+樹索引,確定每個次關鍵字分組及主關鍵字分組中關鍵字節(jié)點所對應的實體E-R子樹; 步驟四:據(jù)查詢表達式中的操作符執(zhí)行操作運算,過濾操作符享有最高優(yōu)先級,交集或并集運算次之; 步驟五:確定最終結果子樹:主次實體子樹應在滿足過濾條件的情況下,最終進行結果的返回,主實體子樹應是對次實體子樹的包含。2.根據(jù)權利要求1所述的基于關鍵字主次分類的XML查詢方法,其特征在于,步驟一中所述數(shù)值節(jié)點索引是用哈希表來存儲每個數(shù)值節(jié)點的節(jié)點信息,鏈地址方法處理節(jié)點存儲位置的沖突,每一個索引項包含節(jié)點的Dewey碼及本位屬性節(jié)點名稱。3.根據(jù)權利要求2所述的基于關鍵字主次分類的XML查詢方法,其特征在于,步驟一中所述名稱節(jié)點索引是以哈希表結構來存儲節(jié)點信息,鏈地址方法處理節(jié)點沖突; 每個存儲單元包含節(jié)點Dewey碼、標記該節(jié)點是屬于連接節(jié)點、屬性節(jié)點、還是實體節(jié)點的標記符,以及該節(jié)點所對應的本位實體節(jié)點或是最近祖先實體節(jié)點的信息。4.根據(jù)權利要求3所述的基于關鍵字主次分類的XML查詢方法,其特征在于,步驟一中所述實體E-R索引是以B+樹結構存儲文檔中實體節(jié)點的相關信息,包括該實體節(jié)點的Dewey編碼以及實體節(jié)點所在實體E-R子樹中各個屬性節(jié)點Dewey碼及標簽信息。5.根據(jù)權利要求1所述的基于關鍵字主次分類的XML查詢方法,其特征在于,步驟二的具體方法為: 步驟2-1:根據(jù)查詢語法結構規(guī)則,檢查查詢用例表達式的合法性: 主關鍵字的每個分組“[]”中,不能出現(xiàn)單引號標記的數(shù)值節(jié)點; 主次關鍵字分組之間需要“ I ”過濾操作符進行分隔; 次關鍵字分組“[]”中只能是對一個屬性或實體的描述,在一個次關鍵字分組中不能出現(xiàn)多個非數(shù)值節(jié)點; 當用戶輸入的表達式符合語法規(guī)則,則進行查詢表達式解析;否則,輸出提示; 步驟2-2:當用戶輸入查詢表達式符合語法規(guī)則之后,算法需要解析用戶輸入的查詢表達式,從中分別獲取主關鍵字分組和次關鍵字分組,將其存入不同的數(shù)組中:對于每個次關鍵字分組,則需要根據(jù)所有的關鍵字節(jié)點對應的索引機制得到次關鍵字分組的Dewey碼集合,不論次關鍵字組中的節(jié)點屬于名稱節(jié)點還是數(shù)值節(jié)點,都可以通過節(jié)點所在的節(jié)點三元式以及節(jié)點的名稱節(jié)點索引或數(shù)值節(jié)點索引得到每一個關鍵字分組的Dewey碼集合。
【文檔編號】G06F17/30GK105956126SQ201610298862
【公開日】2016年9月21日
【申請日】2016年5月6日
【發(fā)明人】周文歡, 陳梵, 李鵬, 季瑋, 花子嵐, 方鵬, 孫克成
【申請人】南京國電南自電網(wǎng)自動化有限公司