??xml version="1.0" encoding="utf-8" standalone="yes"?>
Roger L. Costello
David B. Jacobs
什么时候?/span>rdf:IDQ什么时候?/span>rdf:about?
当你想介l一个资源,q提供一pd关于q个资源的最初信息的时候?/span>rdf:IDQ当你想扩展关于q个资源的信息时Q?/span>rdf:about?/span>RDF的原理和Web的原理一P无论什么hQ无Z么地方,无论什么时间都能提供关于资源的信息?/span>
解释RDF
<?xml version="1.0"?>
<River xmlns="http://www.geodesy.org/river#">
<name>Yangtze</name>
<length>6300 kilometers</length>
<startingLocation>western China's Qinghai-Tibet Plateau</startingLocation>
<endingLocation>East China Sea</endingLocation>
</River>
以上RDF文g理解如下Q这是一?/span>Rivercȝ实例。其名ؓYangtzeQ长6300千米Qv源地位西部青Pl束地点Z国东此RDF文的资源是匿名的,它没有识别符?/span>
rdf:BagcdQ?/span>表示一个未排序的集合。如Q?/span>
<?xml version="1.0"?>
<Meeting rdf:ID="XML-Design-Pattern"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.business.org#">
<attendees>
<rdf:Bag>
<name>John Smith</name>
<name>Sally Jones</name>
</rdf:Bag>
</attendees>
</Meeting>
rdf:AltcdQ?/span>表示一pd供选择的序列。如Q?/span>
<?xml version="1.0"?>
<Retailer rdf:ID="BarnesAndNoble"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.retailers.org#">
<webLocation>
<rdf:Alt>
<url>http://www.bn.com</url>
url>http://www.barnesandnoble.com</url>
</rdf:Alt>
</webLocation>
</Retailer>
rdf:SeqcdQ?/span>用作表示序的属性。如Q?/span>
<?xml version="1.0"?>
<ToDoList rdf:ID="MondayMeetings"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.reminders.org#">
<activities>
<rdf:Seq>
<activity1>Meet with CEO at 10am</activity1>
<activity2>Luncheon at The Eatery</activity2>
<activity3>Flight at 3pm</activity3>
</rdf:Seq>
</activities>
</ToDoList>
ServiceProfileQ类g服务的黄,描述了服务查询代理用来判断服务是否满_要求的一l属性信息,如服务提供的功能、输入输出、执行的前提条g、执行的后果{?/span>
ServiceModelQ描qC服务的过E模型(使用服务时所涉及的控制流和数据流Q。它描述了服务是如何工作的,?/span>ServiceGrounding配合用于服务的自动组合和执行?/span>
ServiceGroundingQ将q程模型的描q和WSDL中东通讯协议及消息联pv来。描qC如何讉K一个服务?/span>
具体来说Q?/span>OWL-SZPDDLQ一U用于描q规划领域问题的规范语言Q,?/span>Web服务看成?/span>AI中的动作或行为,用参数、前提和l果{来描述一个服务,同时输入和输Z作ؓ知识型的前提和结果。在服务l合规划Ӟ需要将q些表示~译成合适的动作形式化描qͼ例如状态演。)然而,对于服务l合的支持,OWL-S仍有不。如Q?/span>OWL语言Z描述逻辑Q在表达一般规则方面有局限性,不能很好地表C用L偏好和约束?/span>
----Z语义Web的服务自动组合技术的研究
Resource Description FrameworkQ资源描q框Ӟ?/span>W
?/span>XML中的标记Q?/span>tagsQ类|RDF中的属性(propertiesQ集也是没有M限制的。也是说存在同义词现象和一词多意现象?/span>RDF的模型不具备解决q两个问题的能力Q?/span>RDF Schema虽然可以?/span>RDF资源的的属性和cd提供词汇表,但是ZRDF的数据语义描qC然可能存在语义冲H。ؓ了消解语义冲H,我们在描q数据语义的时候可以通过引用Ontology的相x术,对语义描q结果作q一步的U束。幸q的是,RDF(Schema)在提供了单的机器可理解语义模型的同时Qؓ领域化的Ontology语言Q?/span>OILQ?/span>OWLQ提供了建模基础Qƈ使得ZRDF的应用可以方便地与这?/span>Ontology语言所生成?/span>Ontologyq行合ƈ?/span>RDF的这一Ҏ(gu)得基?/span>RDF的语义描q结果具备了可以和更多的领域知识q行交互的能力,也ZXML?/span>RDF?/span>Web数据描述具备了良好的生命力?/span>
OWL全称Web Ontology LanguageQ是W
针对不同的需?/span>OWL有三个子语言Q描q列表如下:
子语a |
描述 |
例子 |
OWL Lite |
用于提供l那些只需要一个分cdơ和单的属性约束的用户?/span> |
支持基数Q?/span>cardinalityQ,只允许基Cؓ0?/span>1?/span> |
OWL DL |
支持那些需要在推理pȝ上进行最大程度表辄用户Q这里的推理pȝ能够保证计算完全性(computational
completenessQ即所有地l论都能够保证被计算出来Q和可决定性(decidabilityQ即所有的计算都在有限的时间内完成Q。它包括?/span>OWL语言的所有约束,但是可以被仅仅置于特定的U束下?/span> |
当一个类可以是多个类的一个子cLQ它被约束不能是另外一个类的实例?/span> |
OWL Full |
支持那些需要在没有计算保证的语法自qRDF上进行最大程度表辄用户。它允许在一?/span>Ontology在预定义的(RDF?/span>OWLQ词汇表上增加词汇,从而Q何推理Y件均不能支持OWL FULL的所?/span>feature?/span> |
一个类可以被同时表达ؓ许多个体的一个集合以及这个集合中的一个个体?/span> |
“概念?#8221;是指通过定相关的概念,对生zM某些现象的抽象化建模Q?#8220;昑ּ”是明定义用的概念cd以及对它们的使用U束Q?#8220;形式?#8221;指定义的ontology应该是机器可ȝ事实Q而不是自然语aQ?#8220;׃n”说明了一?/span>ontology不是个hU有的,而是在一定范围内被h们普遍接受?/span>
----Z语义Web的服务自动组合技术的研究
描述逻辑(Description Logic)Q是一U功能强大的Z逻辑的知识表达语aQ可以看成是一U结构化的一阉辑Q主要用于徏模对象和cȝ丰富层次l构?/span>
Gruber提出?/span>5条规则:
1 明确性和客观性:ontology应该用自然语aҎ(gu)定义的术语给出明的、客观的语义定义?/span>
2 完全性:所l定定义是完整的Q完全能表达所描述术语的含义?/span>
3 一致性:由术语所得的推论与术语本w的含义是相容的Q不会生矛盾?/span>
4 最大单调可扩展性:?/span>ontology中添加通用或专用的术语Ӟ不需要修改其已有的内宏V?/span>
5 最承诺:对待建模对象l出可能少的约束?/span>
----Ontology研究lD
Web服务l合所采用的具体方法和技术依赖于Web服务描述所采用的方法和方式。从服务l合的角度来_服务描述的主要工作在于选择合适的Web服务描述语言?/span>Web服务模型Q有效地?/span>Web服务l合提供必要的信息?/span>
Web服务的输入、输出参数的cd信息?/span>Web服务l合Ҏ(gu)中有着重要的地位。但仅仅依赖它似乎不能给Z个正的Web服务l合。通过?/span>Web服务功能的结构化描述Q即Web服务的前提条件及执行l果Q,我们能够保证获得的组合服务是能够满查询的要求的。对服务功能q行l构化描q的需求也是导致本体和规则的整合问题成为当前语?/span>Web中的研究热点的一个原因?/span>
MQ语?/span>Web服务l合的自动化M开自动推理Q而各U各L形式化系l都有其自n在计复杂度和表达能力之间的权衡和考量。如何选择和设计一个适合语义Web服务l合的Ş式系l,是语aWeb服务l合的自动化中最核心、最基本的问题?/span>
语义Web服务l合的粒度可参照语义Web服务描述分ؓ三个层次。第一层次是在Web服务输入、输出参数的cd上进行服务组合,该层ơ中的推理对象只涉及?/span>OWL中的c,语义Web刚好能够满它对推理能力的要求。第二层ơ上?/span>Web服务执行的前提条件和l构上进行服务组合,该层ơ通常要借助?/span>OWL之外的推理机Ӟ比如演绎规则pȝQ但?/span>OWL和演l规则系l的l合常常D服务l合法不可判定。第三个层次是在Web服务外包行ؓ上进行服务组合,它所采用的方法或是借鉴或是直接取自服务验证领域的工作,但通常我们q不会单独地在这个层ơ上q行服务l合Q而是把它当作前面的两个层ơ上的服务组合方法的有效补充?/span>
----语义Web服务的自动组合方法:研究lD
Web服务l合Ҏ(gu)的研I工作主要来自两个领域:一个是人工领域Q另一个是形式化方法和自动推理领域。h工智能领域的研究人员从h工智能规划(AI PlanningQ的角度提出一pd的面?/span>Web服务功能?/span>Web服务l合Q规划)Ҏ(gu)。来自Ş式化Ҏ(gu)和自动推理领域的工作除了面向Web服务行ؓ的服务组合(验证Q方法,也不乏借鉴自动化程序综合和模型验的Ҏ(gu)?/span>
人工规划l合Ҏ(gu)的不I
1 无法产生能够?/span>Web服务的非定性和q发性相适应的组合服务?/span>
2 Web服务的行为特性和l典规划中的动作的行为特征是非常不一LQ这使得规划法难以?/span>Web服务l合中得到应用?/span>
ZWeb服务行ؓ的组合方法:
能克服基于h工智能规划方法的上述不Q但无法满用户的需求?/span>Web服务的行为通常借助于自动机或进E代数进行表q。改q方法:把消息的参数cd与领域本体中的概念联pv来,q在服务l合时加以考虑Q那么就能保证生的l合服务不仅能在行ؓ上满用户需求,而且在功能上也能够满用户需求?/span>
Web服务l合?/span>Web服务匚w的联pL非常密切的,如果把服务组合当作一个状态收索过E的话,那么服务匚wq当于q个收烦q程之中{选合适的后状态的步骤?/span>
----ZOntology?/span>Web服务l合Ҏ(gu)
Void *ptr; // ?/span> ptr 声明Z个通用指针Q但没有指定它指向的东西?/span>
Void 指针最常见的用途是用于声明函数的参数。你可能会希望你的一个函数能够处理不同的cd的参敎ͼ可以?/span> int 变量传递给它,也可以将 float 变量传给它,{等。这L情况下,你可以将函数声明为接?/span> void 指针作ؓ参数Q则它可以接受Q何类型的数据Q可以将指向M东西的指针传递给该函数。如Q?/span>
Void half(void *val);
下面是一个例子程序:
E序输出l果Q?br />20
100000
12.456000
123.044444
10
50000
6.228000
61.522222
import java.util.*;
public class CalendarTest
{
public static void main(String[] args)
{
// 首先构造一个日历对象,把它初始化ؓ当前的日期和旉Q?br /> GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);//得到当前的日?br /> int month = d.get(Calendar.MONTH);//得到当前的月?/em>
d.set(Calendar.DAY_OF_MONTH, 1); // 讄d为当前的q个月的W一?br /> int weekday = d.get(Calendar.DAY_OF_WEEK); //得到q一天是星期几,如果是星期天的话Qweekday被设|ؓ1Q依ơ类?/em>
System.out.println("Sun Mon Tue Wed Thu Fri Sat"); // 打印标题头和I格作ؓW一?/em>
for (int i = Calendar.SUNDAY; i < weekday; i++ )//扑ֈW一天对应的星期几的位置
System.out.print(" ");
do
{
int day = d.get(Calendar.DAY_OF_MONTH);//因ؓ前面讄了d为当前月的第一天,所以第一ơ@环中day?
if (day < 10) System.out.print(" ");//如果天小?0Q就打印一个空|然后打印天?br /> System.out.print(day);
if (day == today)//如果q天是当然就在后面打C*
System.out.print("* ");
else
System.out.print(" ");
if (weekday == Calendar.SATURDAY)// 如果是星?在后面q行换行
System.out.println();
d.add(Calendar.DAY_OF_MONTH, 1);// 然后Q我们让d指向下一?br /> weekday = d.get(Calendar.DAY_OF_WEEK);//上一句代码设|了Z一天的日期Q所以这个weekdayZ一天的星期?br /> }
while (d.get(Calendar.MONTH) == month);//如果d在当月中׃持@?br />
if (weekday != Calendar.SUNDAY) // 打印最后的?br /> System.out.println();
}
}
l果输出:
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10* 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
#define LEN 20
Struct names{
Char first[LEN];
Char last[LEN];
};
Struct pnames{
Char * first;
Char * last;
};
{案是可以这样声明,但是可能会遇到麻烦,你得理解其含义.考虑以下的代码:
Struct names veep={“Talia? “Summers”};
Struct pnames treas={“Brad? “Fallingjaw”};
Printf(?s and %s\n?veep.first,treas.first);
q是一D|的代码Q也能正常运行,但是h考下字符串存储在哪里Q对?/span> Struct names 变量 veep 来说Q字W串存储在结构内部;q个l构共分配了 40 字节来存放两个字W串Q然而,对于 Struct pnames 变量 treas 来说Q字W串存储在编译器存储字符串常量的M地方Q这个结构存攄只是两个地址而已Q在pȝ中它d占用 8 个字节. Struct pnames l构不ؓ字符串分配Q何存储空_它只适用于在另外的地方已lؓ字符串分配了I间Q简单的_ Struct pnames l构中的指针应该只用来管理那些已l创建的而且在程序其他地方已l分配过I间的字W串Q?/span>
再来看看q个限制条g在什么情况下升为问题:
Struct names accountant;
Struct pnames attorney;
Puts(“Enter the last name of your accountant:?;
Scanf(?s?accountant.last);
Puts(“Enter the last name of your attorney?;
Scanf(?s?attorney.last);
语法斚w来说Q这D代码没有问题,但是考虑下把输入存储到哪里了Q对会计师来_他的名字存储?/span> accountant 变量的最后一个成员中Q这个结构有一个用来存攑֭W串的数l.对律师来_ scanf() 把字W串攑ֈ?/span> attorney.last l出的地址中.因ؓq是个没有初始化的变量,所有该地址可能是Q何|E序可以把名字攑֜M地方Q?/span>
所以,我们如果需要一个结构来存储字符Ԍ请用字W数l成员.存储字符指针有它的用处,但也有被严重误用的可能.
Z么用指向结构的指针Q?/span>
1 像指向数组的指针比数组本n更容易操作一P指向l构的指针通常都比l构本n更容易操?
2 在一些早期的 C 实现中,l构不能作ؓ参数被传递给函数Q但指向l构的指针可以.
3
许多奇妙的数据表C都使用了包含指向其他结构的指针的结构.
下面是个例子Q?br />
/* friends.c -- uses pointer to a structure */
#include <stdio.h>
#define LEN 20
struct names {
char first[LEN];
char last[LEN];
};
struct guy {
struct names handle;
char favfood[LEN];
char job[LEN];
float income;
};
int main(void)
{
struct guy fellow[2] = {
{{ "Ewen", "Villard"},
"grilled salmon",
"personality coach",
58112.00
},
{{"Rodney", "Swillbelly"},
"tripe",
"tabloid editor",
232400.00
}
};
struct guy * him; /* 声明指向l构的指针,q个声明不是建立一个新的结构,而是意味
着指针him现在可以指向M现有的guycd的结?/
printf("address #1: %p #2: %p\n", &fellow[0], &fellow[1]);
him = &fellow[0]; /* 告诉该指针它要指向的地址 */
printf("pointer #1: %p #2: %p\n", him, him + 1);
printf("him->income is $%.2f: (*him).income is $%.2f\n",
him->income, (*him).income);
him++; /*指向下一个结?/
printf("him->favfood is %s: him->handle.last is %s\n",
him->favfood, him->handle.last);
return 0;
}
输出l果Q?br />address #1: 0240FEB0 #2: 0240FF04
pointer #1: 0240FEB0 #2: 0240FF04
him->income is $58112.00: (*him).income is $58112.00
him->favfood is tripe: him->handle.last is Swillbelly
Press any key to continue...
从输出看?/span>
him
指向
fellow[0],him+1
指向
fellow[1]
Q注?/span>
him
加上
1
Q地址加?/span>
84
Q这是因为每?/span>
guy
l构占用?/span>
84
字节的内存区域.
使用指针讉K成员的方法:
1 him->income 但是不能 him.income Q因?/span> him 不是一个结构名Q?/span>
2 如果 him=&fellow[0], 那么 *him=fellow[0] Q因?/span> & ?/span> * 是一对互逆的q算W.因此Q可以做以下替换Q?br /> fellow[0].income= =(*him).income 注意q里必须要有圆括P因ؓ . q算W比 * 的优先高.