監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

石家莊OA信息化的基本XML和RDF技術(shù)(二):將文件合并到RDF模型和基本的RDF查詢

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

知識(shí)管理的基本XML和RDF技術(shù)(二) : 將文件合并到RDF模型和基本的RDF查詢


Uche Ogbuji(
uche.ogbuji@fourthought.com

首席顧問(wèn),F(xiàn)ourthought, Inc.

2001 年 9 月

這篇“Thinking XML”專欄文章演示了如何將從多個(gè) XML 源文檔中收集的元數(shù)據(jù)合并到用于有效查詢的單個(gè)“資源描述框架”(Resource Description Frame (RDF))模型中。專欄作家 Uche Ogbuji 在前一篇中介紹了如何一起使用 XML 和 RDF 來(lái)進(jìn)行知識(shí)管理,本文是上一篇的繼續(xù),在本文中他論述了基于用從現(xiàn)有的 XML 格式獲取的數(shù)據(jù)組成 RDF 模型的技術(shù)。該文的中心是一個(gè)示例,在該示例中,擴(kuò)展基于 Web 的問(wèn)題跟蹤器(最初開(kāi)發(fā)它來(lái)操縱 XML 格式的應(yīng)用程序數(shù)據(jù))來(lái)利用 RDF。XSLT 和 Python 樣本代碼清單演示了將來(lái)自 XML 文件的元數(shù)據(jù)聚合到單個(gè) RDF 模型(一個(gè)使用 XSLT ,另一個(gè)使用 RDF)以及簡(jiǎn)單 RDF 查詢的示例。

在本專欄的前一篇文章中,即知識(shí)管理的基本 XML 和 RDF 技術(shù),第一部分(在繼續(xù)閱讀之前,可能需要重新回顧一下),介紹了一個(gè)基于收集的數(shù)據(jù)(以 XML 格式表示)的問(wèn)題跟蹤器應(yīng)用程序示例。然后演示了如何使用 XSLT 從應(yīng)用程序數(shù)據(jù)中抽取 RDF。

本專欄文章通過(guò)演示如何組合由轉(zhuǎn)換每個(gè) XML 源文檔所創(chuàng)建的離散的 RDF 片段來(lái)完成這些事情。同時(shí)還演示了一些基本的查詢技術(shù)。

資源批量派生

在上篇專欄文章中,完成了一個(gè)從 XML 源文件中抽取作為序列化格式的 RDF 的練習(xí)。然而,知識(shí)管理的大多數(shù)有用之處在于操縱 RDF 語(yǔ)句的抽象模型,而不是個(gè)別序列化文件。RDF 模型是圖形結(jié)構(gòu),該結(jié)構(gòu)可以非常簡(jiǎn)單也可以令人難以置信的復(fù)雜。(事實(shí)上,極端情況下,Semantic Web 的設(shè)想是要?jiǎng)?chuàng)建至少同當(dāng)前 Web 一樣大的 RDF 模型。如果實(shí)現(xiàn)該模型的話,它可能是曾經(jīng)在使用中的最大的計(jì)算機(jī)數(shù)據(jù)結(jié)構(gòu)。)

迄今為止,問(wèn)題跟蹤器的示例是由一組 XML 文件組成的,這些文件是 RDF 模型各部分的序列化。每一部分就象七巧板中的一塊,如果將它們組合到一塊兒,將表示問(wèn)題跟蹤器應(yīng)用程序中所有數(shù)據(jù)的 RDF 模型。每一部分本身并不十分重要,因此下一步來(lái)討論如何創(chuàng)建一幅完整的“圖畫”,該“圖畫”才是知識(shí)管理的真正價(jià)值所在。

使用 XSLT 進(jìn)行批量轉(zhuǎn)換

拼裝該“圖畫”的一種選擇是根本不處理七巧板塊,而是使用 XSLT 一勞永逸地生成該“圖畫”。可以編寫一個(gè)轉(zhuǎn)換,該轉(zhuǎn)換收集每個(gè) XML 問(wèn)題文檔,并運(yùn)用前一篇文章中所描述的 RDF 轉(zhuǎn)換處理,然后將每次轉(zhuǎn)換結(jié)果累積到一個(gè)序列化 RDF 結(jié)果。要做到這一點(diǎn),需要利用標(biāo)準(zhǔn)的 document() XSLT 函數(shù),該函數(shù)可以讀入任意的文檔,這些文檔是作為用于轉(zhuǎn)換的補(bǔ)充性 XML 源文檔。

document() 函數(shù)需要知道所要讀入文檔的準(zhǔn)確名稱。XSLT 沒(méi)有(比如說(shuō))通過(guò)使用通配符來(lái)讀入多個(gè)文檔的標(biāo)準(zhǔn)機(jī)制??梢酝ㄟ^(guò)許多方法解決這一問(wèn)題(包括借助于 XSLT 擴(kuò)展,該擴(kuò)展允許通過(guò)通配符或其它機(jī)制來(lái)批量裝入文檔)。然而,因?yàn)檫@不是本示例的中心問(wèn)題,所以選擇創(chuàng)建帶有每個(gè)問(wèn)題文檔清單的集中(hub) XSLT 文檔這項(xiàng)折中方案。清單 1 issue-hub.xml 用指定的兩個(gè)問(wèn)題文檔(在前一篇專欄文章中介紹過(guò))來(lái)演示集中文檔是什么樣子的。

清單 1:帶有每個(gè)應(yīng)用程序數(shù)據(jù)文檔的問(wèn)題文檔清單的集中 XML 文檔。

issue1.xml

issue2.xml

一旦有了集中文檔,就可以將清單 2 metadata-batch.xslt 中的轉(zhuǎn)換應(yīng)用到作為源文檔的集中文檔中以從所有列出的問(wèn)題中創(chuàng)建聚合 RDF。

清單 2 看起來(lái)可能非常熟悉;其中大多數(shù)同前一篇文章中的轉(zhuǎn)換相同。這是因?yàn)槲液芰粢?XML 結(jié)構(gòu)的模塊化處理。根模板現(xiàn)在從集中文檔中查找每個(gè) issue 元素(注意,這里使用空名稱空間)。然后它從每個(gè)元素內(nèi)容中指定的文件名裝入文檔。注意,這里使用 document(.)/* 而不僅僅是 document(.)。這種構(gòu)造防止處理器匹配問(wèn)題文檔的根節(jié)點(diǎn),這會(huì)結(jié)束調(diào)用打算用于集中文檔根節(jié)點(diǎn)的模板。那些正是本專欄文章的批量轉(zhuǎn)換中的唯一區(qū)別。

可以使用任何 XSLT 處理器來(lái)執(zhí)行該轉(zhuǎn)換。我使用 4XSLT 來(lái)執(zhí)行轉(zhuǎn)換,如下所示:

$ 4xslt -o issues.rdf issue-hub.xml metadata-batch.xslt

該轉(zhuǎn)換導(dǎo)致 issues.rdf 中的序列化 RDF,它包含來(lái)自 issue1.xml 和 issue2.xml 中的元數(shù)據(jù)。

使用 RDF 工具進(jìn)行批量轉(zhuǎn)換

將多個(gè) XML 文檔聚合到單個(gè) RDF 模型中的另一種選擇是(如前一篇文章所述)分別構(gòu)建每個(gè) RDF 文檔,然后使用 RDF 解析器將所有的文檔解析成單個(gè)抽象模型。例如,通過(guò)對(duì)從前面一篇專欄文章中的示例問(wèn)題文件中生成的兩個(gè) RDF 文件使用 4RDF,將得到清單 3。

清單 3:從 XML 文件中派生,并由 RDF 解析器(這里是 4RDF)分析的兩個(gè) RDF 問(wèn)題文件的批量轉(zhuǎn)換結(jié)果

$ 4rdf -d 1.rdf 2.rdf

The following is a list of resulting tuples, each in the form "subject,

predicate, object".

[

("http://meta.rdfinference.org/ril/issue-tracker/ril-20010502",

"http://xmlns.rdfinference.org/ril/issue-tracker#issue",

"#i2001030423"),

("#anonymous:e08-e06-30b-90d-a060005104", "id", "i2001030423"),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:1040d07-20b-909-407-b0e0402205",

"http://xmlns.rdfinference.org/ril/issue-tracker#author", "Alexandre

Fayolle "),

("#anonymous:1040d07-20b-909-407-b0e0402205",

"http://xmlns.rdfinference.org/ril/issue-tracker#body", "The

abbreviation in listing 8 doesn't seem necessary to Nico Chauvat or

me."),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#comment",

"#anonymous:1040d07-20b-909-407-b0e0402205"),

("#anonymous:60e0b06-50a-80c-90c-50a0a08602",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:60e0b06-50a-80c-90c-50a0a08602",

"http://xmlns.rdfinference.org/ril/issue-tracker#assignment",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#action",

"#anonymous:60e0b06-50a-80c-90c-50a0a08602"),

("http://meta.rdfinference.org/ril/issue-tracker/ril-20010502",

"http://xmlns.rdfinference.org/ril/issue-tracker#issue",

"#i2001042003"),

("#anonymous:2030002-506-10a-201-f090809c08", "id", "i2001042003"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#nchauvat"),

("#anonymous:c000706-b0b-d02-d0a-e050c0460b",

"http://xmlns.rdfinference.org/ril/issue-tracker#author", "Alexandre

Fayolle "),

("#anonymous:c000706-b0b-d02-d0a-e050c0460b",

"http://xmlns.rdfinference.org/ril/issue-tracker#body", "I agree"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#comment",

"#anonymous:c000706-b0b-d02-d0a-e050c0460b"),

("#anonymous:b0c0c00-800-2-c08-20a0d0f209",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:b0c0c00-800-2-c08-20a0d0f209",

"http://xmlns.rdfinference.org/ril/issue-tracker#assignment",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#action",

"#anonymous:b0c0c00-800-2-c08-20a0d0f209"),

]

清單 3 中第一行里的 -d 選項(xiàng)告訴 $RDF 將 subject/predicate/object 三元組從抽象 RDF 模型轉(zhuǎn)儲(chǔ)到命令行,該命令行顯示清單 3 的剩余部分.

一旦有了問(wèn)題跟蹤器的完整 RDF 模型,可能希望以一種更易于閱讀的格式而不是清單 3 中所顯示的那種格式來(lái)查看它。例如,如果以清單 3 中的聚合 RDF 文件為例,并使用 Dan Brickley 的 RDF 可視化工具(請(qǐng)參閱參考資料)來(lái)處理它。

可以立即辨別出某種模式,譬如用戶“uogbuji”的投稿和職責(zé)。當(dāng)然,我必須承認(rèn) RDF 中隨同 URI 而來(lái)的冗長(zhǎng)的標(biāo)識(shí)符妨礙了這一清晰性。

跨系統(tǒng)查詢

擁有可用元數(shù)據(jù)的 RDF 模型的另外一個(gè)立桿見(jiàn)影的好處在于:它使許多系統(tǒng)級(jí)查詢(相對(duì)于編寫針對(duì)一組 XML 文檔的 XPath 查詢,或?qū)?shù)據(jù)集中到專用數(shù)據(jù)結(jié)構(gòu)以用于查詢)變得更簡(jiǎn)單更一般。雖然,“XML 查詢語(yǔ)言”(XQuery)和 XML 資源庫(kù)供應(yīng)商提供的專用文檔收集查詢工具的出現(xiàn)也幫助解決了這一需求,但是現(xiàn)在可以使用 RDF,至少這種基本模型是標(biāo)準(zhǔn)化的。

遺憾的是,RDF 模型的查詢還不是標(biāo)準(zhǔn)化的,這是 RDF 社區(qū)需要填補(bǔ)的非常重要的漏洞。幸運(yùn)的是,由于 RDF 模型的簡(jiǎn)單性,所以非常容易通過(guò)基本模式匹配來(lái)構(gòu)建幾乎所有形式的查詢。這是 4RDF 中所使用的基本方法,其中,查詢就是就是查找語(yǔ)句三元組的過(guò)程,該三元組匹配給定的主語(yǔ)、謂語(yǔ)和賓語(yǔ)模式。作為示例,請(qǐng)看表 1 中剛創(chuàng)建的部分統(tǒng)一模型。

表 1 .來(lái)自問(wèn)題跟蹤器數(shù)據(jù)的一些語(yǔ)句

主語(yǔ): #anonymous:a0d010d-f0c-706-20e-80a0407606 謂語(yǔ): http://xmlns.rdfinference.org/ril/issue-tracker#body 賓語(yǔ): Organize a vote on this topic 主語(yǔ): #anonymous:a0d010d-f0c-706-20e-80a0407606 謂語(yǔ): http://xmlns.rdfinference.org/ril/issue-tracker#assign-to 賓語(yǔ): http://users.rdfinference.org/ril/issue-tracker#uogbuji 主語(yǔ): #anonymous:402000d-403-309-c01-9080a205 謂語(yǔ): http://xmlns.rdfinference.org/ril/issue-tracker#body 賓語(yǔ): Correct all to use the "0/1" form in the next draft. 主語(yǔ): #anonymous:402000d-403-309-c01-9080a205 謂語(yǔ): http://xmlns.rdfinference.org/ril/issue-tracker#assign-to 賓語(yǔ): http://users.rdfinference.org/ril/issue-tracker#uogbuji

有了這些三元組,就會(huì)非常容易地明白別人是如何會(huì)簡(jiǎn)單地詢問(wèn)如下問(wèn)題:“給用戶 uogbuji 分配的操作標(biāo)識(shí)是什么?”以及“每個(gè)操作的主體是什么?”。將第一個(gè)問(wèn)題轉(zhuǎn)換成查找匹配下列模式的三元組,這里的“*”是匹配任何值的通配符:

主語(yǔ) 謂語(yǔ) 賓語(yǔ) * http://xmlns.rdfinference.org/ril/issue-tracker#assign-to http://users.rdfinference.org/ril/issue-tracker#uogbuji

對(duì)此的響應(yīng)之一是帶有主語(yǔ)“#anonymous:a0d010d-f0c-706-20e-80a0407606”(表示匹配的操作標(biāo)識(shí))的語(yǔ)句。注意,該標(biāo)識(shí)是由 4RDF 為匿名資源(如果資源沒(méi)有標(biāo)識(shí),則由應(yīng)用程序顯式地分配一個(gè))生成的特殊標(biāo)識(shí)。構(gòu)成全球唯一標(biāo)識(shí)符(UUID)的一個(gè)十六進(jìn)制值緊跟在“anonymous”序列之后。有了這個(gè)標(biāo)識(shí),第二個(gè)示例問(wèn)題相當(dāng)于匹配下列模式,該模式返回帶有賓語(yǔ)“Organize a vote on this topic”的語(yǔ)句:

主語(yǔ) 謂語(yǔ) 賓語(yǔ) #anonymous:a0d010d-f0c-706-20e-80a0407606 http://xmlns.rdfinference.org/ril/issue-tracker#body *

建立在這一簡(jiǎn)單的想法上,幾乎任何形式的 RDF 查詢(甚至關(guān)系型(SQL)查詢和對(duì)象(OQL)查詢的等價(jià)查詢)都是可能的。

編碼 RDF 查詢
清單 4 中的 Python 程序 query1.py 通過(guò)模式匹配、讀入 issues.rdf 文件以及打印 uogbuji 的所有任務(wù)的主體,使用 4RDF 來(lái)運(yùn)用這項(xiàng)查詢技術(shù)。(如果沒(méi)有使用 Python,當(dāng)然可以使用其它 RDF 查詢工具,譬如 RDFDb、Jena 或列在參考資料中“Dave Beckett 的 RDF 資源指南”中的工具。)

清單 4:演示一個(gè) RDF 模型簡(jiǎn)單查詢的 Python 程序。

from Ft.Rdf import Util

#Returns an RDF model object, and the database instance it uses for

#persistence (in our case, it's just a memory data structure)

model, db = Util.DeserializeFromUri('issues.rdf')

db.begin()

USER_ID_BASE = 'http://users.rdfinference.org/ril/issue-tracker#'

IT_SCHEMA_BASE = 'http://xmlns.rdfinference.org/ril/issue-tracker#'

print 'Actions assigned to uogbuji:'

#None is used as the wild-card

matching_statements = model.complete(None,

IT_SCHEMA_BASE+'assign-to',

USER_ID_BASE+'uogbuji'

)

for statement in matching_statements:

id = statement.subject

matching_statements = model.complete(id,

IT_SCHEMA_BASE+'body',

None

)

body = matching_statements[0].object

print "*", body

db.commit()

在清單 4 中,首先從 issues.rdf 文件中讀?。ń獬蛄谢㏑DF;然后執(zhí)行查詢以查找表示指派給 uogbuji 哪些操作的語(yǔ)句。然后使用每個(gè)語(yǔ)句的主語(yǔ)(操作標(biāo)識(shí))來(lái)查詢每個(gè)操作的主體。如果安裝了 Python 和 4Suite,運(yùn)行和下面相同的示例:

$ python query1.py

Actions assigned to uogbuji

* Organize a vote on this topic

* Correct all to use the "0/1" form in the next draft.

這是 RDF 模型查詢的最底級(jí)別,因此有一點(diǎn)麻煩。清單 5 中的 Python 程序 query2.py 通過(guò)直接查詢相關(guān)主語(yǔ)和賓語(yǔ)等而走了一些捷徑。其結(jié)果就是清單 4 中同一個(gè)功能的更簡(jiǎn)單的版本。

清單 5:簡(jiǎn)化查詢代碼

from Ft.Rdf import Util

#Returns an RDF model object, and the database instance it uses for

#persistence (in our case, it's just a memory data structure)

model, db = Util.DeserializeFromUri('issues.rdf')

db.begin()

USER_ID_BASE = 'http://users.rdfinference.org/ril/issue-tracker#'

IT_SCHEMA_BASE = 'http://xmlns.rdfinference.org/ril/issue-tracker#'

print 'Actions assigned to uogbuji:'

actions = Util.GetSubjects(model, IT_SCHEMA_BASE+'assign-to',

USER_ID_BASE+'uogbuji')

for action in actions:

body = Util.GetObject(model, action, IT_SCHEMA_BASE+'body')

print "*", body

db.commit()

清單 5 仍然包含兩種級(jí)別的查詢;使用結(jié)合多個(gè)查詢的單個(gè)請(qǐng)求將更方便和更有效。(通過(guò)使用“RDF 推論語(yǔ)言(RDF Inference Language (RIL))”,那也是可能的,“RDF 推論語(yǔ)言”將在本專欄的后續(xù)文章中討論。順便提一下,示例問(wèn)題跟蹤器數(shù)據(jù)中參考了 RIL 開(kāi)放規(guī)范草稿。)清單 6 演示了在使用或不使用 API 捷徑情況下,執(zhí)行基本查詢的結(jié)果。

清單 6:執(zhí)行同清單 5 相同任務(wù)的簡(jiǎn)化的查詢會(huì)話

$ python query2.py

Actions assigned to uogbuji

* Organize a vote on this topic

* Correct all to use the "0/1" form in the next draft.

RDF 查詢不必涉及元數(shù)據(jù)語(yǔ)句組件的精確匹配。大多數(shù)的查詢語(yǔ)言提供大量的靈活性。作為一個(gè)示例,清單 7(query3.py)中的 Python 程序使用基于正則表達(dá)式的查詢來(lái)查找所有指派給 uogbuji 的操作(該操作的主體包含字符串“vote”)。

同樣,通過(guò)使用 RIL,清單 7 中的代碼將是一個(gè)簡(jiǎn)單查詢而且更有效(將在下一篇專欄文章里講述)。清單 8 演示了查詢中正則表達(dá)式的使用。

清單 8:演示在查詢中使用正則表達(dá)式的會(huì)話

$ python query3.py

Actions assigned to uogbuji

* Organize a vote on this topic

下一次……

本專欄文章演示了如何從示例問(wèn)題跟蹤器應(yīng)用程序?qū)⒏鞑糠纸M成完整的 RDF 模型,并且舉例說(shuō)明了該模型的基本查詢。在下篇文章中將探討一種豐富特性,可以利用 RDF 的強(qiáng)大功能來(lái)低成本地利用該特性。

參考資料

通過(guò)單擊文章頂部或底部的討論來(lái)參與本文的討論論壇。

請(qǐng)下載作者上一篇專欄文章中樣本代碼(介紹了使用 XML 的 RDF 技術(shù))和本專欄中樣本代碼文件的壓縮文件,這些文件使得理解這些示例或修改它們以利于重用變得更加容易。

Uche Ogbuji 的 Introduction to RDF 提供了對(duì) RDF 的基本介紹,并包含指向其它有用資源的鏈接。

Dave Beckett 的 RDF 資源指南 是一個(gè)指向與 RDF 相關(guān)文章、 工具、規(guī)范、討論和事件等等的綜合性的鏈接集。

Dan Brickley 的 RDF 可視化器(是基于 Web 的,并且可以應(yīng)用到任何平臺(tái))象本專欄文章中的圖 1 一樣,以圖形形式表示 RDF 文件。

本文中提及過(guò)但沒(méi)有演示過(guò)的兩個(gè) RDF 查詢工具是與 RDF 數(shù)據(jù)庫(kù) RDFDb 相關(guān)聯(lián)的查詢語(yǔ)言(其提供了用 C 與 Perl 來(lái)訪問(wèn)數(shù)據(jù)庫(kù))和 Jena(用于操縱 RDF 模型的實(shí)驗(yàn)性 Java API)。

使用 4Suite 的 XSLT 處理器測(cè)試了本文中的示例。

XML:the next big thing,是由 Tom Halfhill 所寫的學(xué)術(shù)性 IBM 研究論文,它討論了使用 RDF 增強(qiáng)下一代搜索引擎的可能性。

請(qǐng)參閱本專欄以前的專題,題為:

    • XML 和語(yǔ)義: 實(shí)際情況
    • XML 和語(yǔ)義: 該領(lǐng)域中的新生事物以及舊的鄰近范疇的另一事物
    • 踏著語(yǔ)義的節(jié)拍
    • 知識(shí)管理的基本 XML 和 RDF 技術(shù), 第一部分

正如 Scientific American article 中所描述的那樣,Semantic Web 正在逐漸成為人們所研究和感興趣的事物,并且現(xiàn)在是 W3C 官方活動(dòng)


關(guān)于作者

Uche Ogbuji 是 Fourthought Inc. 的顧問(wèn)兼合伙創(chuàng)始人,該公司是專為企業(yè)知識(shí)管理應(yīng)用提供 XML 解決方案的供應(yīng)商和咨詢公司。Fourthought 開(kāi)發(fā)了 4Suite、4Suite 服務(wù)器,它們是 XML 中間件的開(kāi)放源碼平臺(tái)。Ogbuji 先生是一名出生于尼日利亞的計(jì)算機(jī)工程師兼作家,他生活和工作在美國(guó)科羅拉多州的博耳德。可以通過(guò) uche.ogbuji@fourthought.com 與 Ogbuji 先生聯(lián)系。

瀏覽:知識(shí)管理的基本XML和RDF技術(shù)(一)

知識(shí)管理的基本XML和RDF技術(shù)(三)

知識(shí)管理的基本XML和RDF技術(shù)(四)

知識(shí)管理的基本XML和RDF 技術(shù)(五)

知識(shí)管理的基本XML和RDF技術(shù)(六)

發(fā)布:2007-03-25 13:31    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
石家莊OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢