上一篇文章介绍了我们所使用的数据。其实,知识图谱数据的来源主要有三个:结构化数据、半结构化数据和非结构化的数据。我们所使用的电影数据就是结构化的数据。半结构化的数据指的是数据有一定的组织形式,但较结构化数据而言更松散(属性名和属性值具有多样性,比如“生日”就有“出生日期”、“诞辰”等多种表达方式),例如百度百科、维基百科、互动百科等;对infobox(下图红框)中的属性和属性值做一定处理后,我们就可以得到结构化的数据。非结构化数据通常是指我们看到的一切纯文本数据。

本文首先介绍W3C的RDB2RDF工作小组制定的两个标准,用于将关系型数据库的数据转换为RDF格式的数据。然后介绍如何利用d2rq这个工具把我们Mysql中的数据转为RDF。

一、两个标准

第一个标准是direct mapping,即直接映射。何为直接映射?看过前面文章的读者心中应该有些猜测了(传送门:“知识图谱基础之RDF,RDFS与OWL”,请参考第二个部分第一段内容)。规则十分简单:

1. 数据库的表作为本体中的类(Class)。比如我们在mysql中保存的数据,一共有5张表。那么通过映射后,我们的本体就有5个类了,而不是我们自己定义的三个类。

2. 表的列作为属性(Property)。

3. 表的行作为实例/资源。

4. 表的单元格值为字面量

5. 如果单元格所在的列是外键,那么其值为IRI,或者说实体/资源。

在实际应用中我们很少用到这种方法,尽管它是最便捷的方式。详细的解释和示例,请参考W3C的官方文档(A Direct Mapping of Relational Data to RDF)。

Direct mapping的缺点很明显,不能把数据库的数据映射到我们自己定义的本体上。RDB2RDF工作小组指定了另外一个标准——R2RML,可以让用户更灵活的编辑和设置映射规则。

我不打算在这里详细地讲解R2RML的具体语法和规则,读者可以自己参考W3C的文档(R2RML: RDB to RDF Mapping Language)。其实可以把它当做一个工具,用的时候再查文档即可,不用把所有的特性和语法都记下来,只需要知道它是什么,能干什么即可。为了让读者有个直观地认识,我们以mysql中的数据为例,介绍怎么把person这个表映射到我们在protege中定义的Person类上,person_name映射到personName上。

@prefix rr: <R2RML: RDB to RDF Mapping Language Schema>.
@prefix : <http://www.kgdemo.com#>.<#TriplesMap1>rr:logicalTable [ rr:tableName "person" ];rr:subjectMap [rr:template "http://www.kgdemo.com/person/{person_id}";rr:class :Person;];rr:predicateObjectMap [rr:predicate :personName;rr:objectMap [ rr:column "person_name" ];].

rr:template指定实体/资源的IRI生成模板,括号中的字符串是对应表中的某个列名。在本例中指每个人物的IRI由我们预定义的前缀加人物ID组成。rr:Class声明这些实体/资源的类是我们在Ontology中定义的Person。rr:predicate指定谓语,即属性。rr:objectMap指定该属性的值是来源于哪一列。其他属性的定义类似,读者可以自己查文档尝试。关于外键的定义,读者也可以参考文档相关示例。

R2RML也支持SQL语句来对查询结果进行映射。比如,我们有一列表示某人的性别,我们可以用SQL语句选取男性的行,把这些行映射成我们定义的男性类。女性同理。这种特性大大增强了其灵活性。

下面我们介绍如何用d2rq这个工具把mysql的数据转为RDF。

二、D2RQ

D2RQ的官方介绍是:

Accessing Relational Databases as Virtual RDF Graphs

没错,以虚拟RDF图的方式访问关系数据库是其最主要的一个特性。它的机理就是通过mapping文件,把对RDF的查询等操作翻译成SQL语句,最终在RDB上实现对应操作。在做知识图谱项目的时候,我们可以灵活地选择数据访问方式。当对外提供服务,查询操作比较频繁的情况下,最好是将RDB的数据直接转为RDF,会节省很多SPARQL到SQL的转换时间。

D2RQ提供了自己的mapping language,其形式和R2RML类似。D2RQ发布了r2rml-kit以支持W3C制定的两个映射标准。D2RQ有一个比较方便的地方,可以根据你的数据库自动生成预定义的mapping文件,用户可以在这个文件上修改,把数据映射到自己的本体上。就我们这个例子而言,数据关系比较简单,自己编辑R2RML文件或者在D2RQ生成的mapping文件上修改效率差不多。在数据关系很复杂的时候,我建议直接在D2RQ生成的mapping文件上修改,会节省很多时间。D2RQ的mapping language也很简洁,同样支持对SQL结果进行映射,其SQL是用condition关键词隐式地表达,不像R2RML是显式的SQL语句。更多的细节请参考官方文档。

下载D2RQ,进入其目录,运行下面的命令生成默认的mapping文件:

generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie

root是mysql的用户名,没有密码则不输入,-o指定输出文件路径及名称,jdbc:mysql:///kg_demo_movie 指定我们要映射的数据库。该命令的其他参数及使用方式请参考文档。

根据我们的mysql数据库生成的默认mapping文件:

@prefix map: <#> .
@prefix db: <> .
@prefix vocab: <vocab/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <XML Schema> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
@prefix jdbc: <http://d2rq.org/terms/jdbc/> .map:database a d2rq:Database;d2rq:jdbcDriver "com.mysql.jdbc.Driver";d2rq:jdbcDSN "jdbc:mysql:///kg_demo_movie";d2rq:username "root";jdbc:autoReconnect "true";jdbc:zeroDateTimeBehavior "convertToNull";.# Table genre
map:genre a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "genre/@@genre.genre_id@@";d2rq:class vocab:genre;d2rq:classDefinitionLabel "genre";.
map:genre__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property rdfs:label;d2rq:pattern "genre #@@genre.genre_id@@";.
map:genre_genre_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property vocab:genre_genre_id;d2rq:propertyDefinitionLabel "genre genre_id";d2rq:column "genre.genre_id";d2rq:datatype xsd:integer;.
map:genre_genre_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property vocab:genre_genre_name;d2rq:propertyDefinitionLabel "genre genre_name";d2rq:column "genre.genre_name";.# Table movie
map:movie a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "movie/@@movie.movie_id@@";d2rq:class vocab:movie;d2rq:classDefinitionLabel "movie";.
map:movie__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property rdfs:label;d2rq:pattern "movie #@@movie.movie_id@@";.
map:movie_movie_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_id;d2rq:propertyDefinitionLabel "movie movie_id";d2rq:column "movie.movie_id";d2rq:datatype xsd:integer;.
map:movie_movie_title a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_title;d2rq:propertyDefinitionLabel "movie movie_title";d2rq:column "movie.movie_title";.
map:movie_movie_introduction a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_introduction;d2rq:propertyDefinitionLabel "movie movie_introduction";d2rq:column "movie.movie_introduction";.
map:movie_movie_rating a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_rating;d2rq:propertyDefinitionLabel "movie movie_rating";d2rq:column "movie.movie_rating";d2rq:datatype xsd:double;.
map:movie_movie_release_date a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_release_date;d2rq:propertyDefinitionLabel "movie movie_release_date";d2rq:column "movie.movie_release_date";.# Table movie_to_genre (n:m)
map:movie_to_genre__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_to_genre;d2rq:refersToClassMap map:genre;d2rq:join "movie_to_genre.movie_id => movie.movie_id";d2rq:join "movie_to_genre.genre_id => genre.genre_id";.# Table person
map:person a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "person/@@person.person_id@@";d2rq:class vocab:person;d2rq:classDefinitionLabel "person";.
map:person__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property rdfs:label;d2rq:pattern "person #@@person.person_id@@";.
map:person_person_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_id;d2rq:propertyDefinitionLabel "person person_id";d2rq:column "person.person_id";d2rq:datatype xsd:integer;.
map:person_person_birth_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_birth_day;d2rq:propertyDefinitionLabel "person person_birth_day";d2rq:column "person.person_birth_day";.
map:person_person_death_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_death_day;d2rq:propertyDefinitionLabel "person person_death_day";d2rq:column "person.person_death_day";.
map:person_person_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_name;d2rq:propertyDefinitionLabel "person person_name";d2rq:column "person.person_name";.
map:person_person_english_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_english_name;d2rq:propertyDefinitionLabel "person person_english_name";d2rq:column "person.person_english_name";.
map:person_person_biography a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_biography;d2rq:propertyDefinitionLabel "person person_biography";d2rq:column "person.person_biography";.
map:person_person_birth_place a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_birth_place;d2rq:propertyDefinitionLabel "person person_birth_place";d2rq:column "person.person_birth_place";.# Table person_to_movie (n:m)
map:person_to_movie__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:person_to_movie;d2rq:refersToClassMap map:person;d2rq:join "person_to_movie.movie_id => movie.movie_id";d2rq:join "person_to_movie.person_id => person.person_id";.

下面是根据我们定义的本体修改的mapping文件。首先,为了表达简练,我们给本体的IRI设置一个前缀。这样

http://www.kgdemo.com#Person

就可以表达为

:Person

其他的词汇同理。

接下来,把默认的映射词汇改为我们本体中的词汇即可。在处理外键的时候要注意当前编辑的属性的domain和range,belongsToClassMap是domain,refersToClassMap是range。

@prefix map: <#> .
@prefix db: <> .
@prefix vocab: <vocab/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <XML Schema> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
@prefix jdbc: <http://d2rq.org/terms/jdbc/> .
@prefix : <http://www.kgdemo.com#> .map:database a d2rq:Database;d2rq:jdbcDriver "com.mysql.jdbc.Driver";d2rq:jdbcDSN "jdbc:mysql:///kg_demo_movie";d2rq:username "root";jdbc:autoReconnect "true";jdbc:zeroDateTimeBehavior "convertToNull";.# Table genre
map:genre a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "genre/@@genre.genre_id@@";d2rq:class :Genre;d2rq:classDefinitionLabel "genre";.
map:genre_genre_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property :genreName;d2rq:propertyDefinitionLabel "genre genre_name";d2rq:column "genre.genre_name";.# Table movie
map:movie a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "movie/@@movie.movie_id@@";d2rq:class :Movie;d2rq:classDefinitionLabel "movie";.
map:movie_movie_title a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieTitle;d2rq:propertyDefinitionLabel "movie movie_title";d2rq:column "movie.movie_title";.
map:movie_movie_introduction a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieIntroduction;d2rq:propertyDefinitionLabel "movie movie_introduction";d2rq:column "movie.movie_introduction";.
map:movie_movie_rating a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieRating;d2rq:propertyDefinitionLabel "movie movie_rating";d2rq:column "movie.movie_rating";d2rq:datatype xsd:double;.
map:movie_movie_release_date a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieReleaseDate;d2rq:propertyDefinitionLabel "movie movie_release_date";d2rq:column "movie.movie_release_date";.# Table movie_to_genre (n:m)
map:movie_to_genre__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :hasGenre;d2rq:refersToClassMap map:genre;d2rq:join "movie_to_genre.movie_id => movie.movie_id";d2rq:join "movie_to_genre.genre_id => genre.genre_id";.# Table person
map:person a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "person/@@person.person_id@@";d2rq:class :Person;d2rq:classDefinitionLabel "person";.
map:person_person_birth_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBirthDay;d2rq:propertyDefinitionLabel "person person_birth_day";d2rq:column "person.person_birth_day";.
map:person_person_death_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personDeathDay;d2rq:propertyDefinitionLabel "person person_death_day";d2rq:column "person.person_death_day";.
map:person_person_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personName;d2rq:propertyDefinitionLabel "person person_name";d2rq:column "person.person_name";.
map:person_person_english_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personEnglishName;d2rq:propertyDefinitionLabel "person person_english_name";d2rq:column "person.person_english_name";.
map:person_person_biography a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBiography;d2rq:propertyDefinitionLabel "person person_biography";d2rq:column "person.person_biography";.
map:person_person_birth_place a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBirthPlace;d2rq:propertyDefinitionLabel "person person_birth_place";d2rq:column "person.person_birth_place";.# Table person_to_movie (n:m)
map:person_to_movie__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :hasActedIn;d2rq:refersToClassMap map:movie;d2rq:join "person_to_movie.movie_id => movie.movie_id";d2rq:join "person_to_movie.person_id => person.person_id";.

语法规则比较简单,具体的操作不再赘述,读者可以参考相关文档(The D2RQ Mapping Language)。

D2RQ支持的数据库有Oracle、MySQL、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。也支持其他某些数据库,但可能会有限制。请参考数据库兼容性说明(Accessing Relational Databases as Virtual RDF Graphs)。

使用下面的命令将我们的数据转为RDF:

.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl

kg_demo_movie_mapping.ttl是我们修改后的mapping文件。其支持导出的RDF格式有“TURTLE”, “RDF/XML”, “RDF/XML-ABBREV”, “N3”, 和“N-TRIPLE”。“N-TRIPLE”是默认的输出格式。

kg_demo_movie.nt 中关于演员的片段:

<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/163441> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/13> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/240171> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/24> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1336> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1337> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1338> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1339> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1340> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1341> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/643> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/82> .

kg_demo_movie.nt 中关于电影的片段:

<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieRating> "7.0E0"^^<XML Schema> .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieIntroduction> "" .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieTitle> "Mang quan gui shou" .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieReleaseDate> "1979-07-13" .
<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.kgdemo.com#Movie> .

总结

本文介绍了W3C制定的从RDB到RDF的两个标准,并介绍了如何利用D2RQ结合我们定义的Ontology将数据转为RDF。mapping文件和RDF数据存放在github项目中,读者可以下载查看或编辑。下一篇文章是概念篇,将介绍语义网技术栈中另一个重要技术标准——RDF的查询语言SPARQL。

https://zhuanlan.zhihu.com/p/32552993

知识图谱实践篇(二):关系数据库到RDF相关推荐

  1. 知识图谱与数据库技术:RDF三元组库和Neo4j图数据库

    知识图谱与数据库系统 随着知识图谱规模的日益增长,知识图谱数据管理问题愈加突出.近年来,知识图谱和数据库领域均认识到大规模知识图谱数据管理任务的紧迫性. 由于传统关系数据库无法有效适应知识图谱的图数据 ...

  2. 知识图谱开发实战:搭建上市公司知识图谱(二)

    搭建上市公司知识图谱(二) 学习目标 1. 获取上市公司公开数据 1.1 获取上市公司列表与行业信息 1.2 代码展示 2. 从网站爬取上市公司网页并存储为 HTML文件 2.1 准备环境 2.2 爬 ...

  3. 知识图谱实践篇(一):数据准备和本体建模

    对知识图谱有兴趣的读者可以关注我的知乎专栏,主要介绍知识图谱的相关概念.技术,也包含一些具体实践. 通过前面几篇文章的介绍,读者应该对知识图谱,其相关概念,以及语义网技术栈中的RDF,RDFS/OWL ...

  4. 知识图谱(二)——知识表示

    知识应用难点在于知识推理,知识推理的难点在于知识表示. 文章目录 一.经典知识表示理论 1.逻辑 (1)命题逻辑 a.命题逻辑真值表 b.一阶谓词逻辑 vs 高阶谓词逻辑 (2)语义网络(Semant ...

  5. 知识图谱实践篇(五):KBQA Demo

    作为实践篇的最后一篇,我们将介绍如何用Python完成一个简易的问答程序.下图是demo的展示效果: 查询结果为空,回答"I don't know.":不能理解问句,回答" ...

  6. 知识图谱 语义网络,语义网,链接数据和知识图谱 (二)--基础篇

    一.语义网络(Semantic Network) 对于初学者来讲,这个概念很容易和语义网(Semantic Web)相混淆.为了行文一致,除非特别说明,语义网络指Semantic Network,语义 ...

  7. python语义网络图_知识图谱 语义网络,语义网,链接数据和知识图谱 (二)--基础篇...

    知识图谱 语义网络,语义网,链接数据和知识图谱 (二)--基础篇 发布时间:2018-05-14 16:10, 浏览次数:370 一.语义网络(Semantic Network) 对于初学者来讲,这个 ...

  8. [知识图谱构建] 二.《Neo4j基础入门》基础学习之创建图数据库节点及关系

    该系列文章主要讲解知识图谱及Neo4j图数据库的用法,本篇文章是作者学习<Neo4j基础入门>书籍的在线笔记,主要讲解Neo4j的基础知识及基本语法,希望大家喜欢. 前文: [知识图谱构建 ...

  9. 深度应用驱动的医学知识图谱构建(二)

    更多分享请关注公众号 系统之神与我同在 数研院医学知识图谱构建 1.模型建立 医学领域的知识图谱由于其知识专业性强,行业通常采用自 上而下的方式,先构建Schema,再抽取知识. 数研院医学知识图谱S ...

最新文章

  1. 漫画:垃圾男人分类图鉴
  2. R语言可视化包ggplot2包调整线条粗细实战(Adjust Line Thickness)
  3. android gradle + junit +jacoco +sonarscaner(sonarrunner) 获取单元测试覆盖率以及代码质量
  4. Cocopods的升级错误解决
  5. Java核心面试问题
  6. mysql(待完善)
  7. Java编程的逻辑 (43) - 剖析TreeMap
  8. rest api是什么_一文搞懂什么是RESTful API
  9. 想赚钱,需要脑袋能开窍
  10. 智能一代云平台(十):Jboss远程访问流程总结
  11. PAT (Basic Level) Practice1010 一元多项式求导
  12. 实时音频编解码之二编码学数学知识
  13. Java八大基本数据类型
  14. 苹果iOS申请个人开发者账号注册教程
  15. 磁力搜索 v2.3.5.0 for Android 免费无广告版
  16. 计算机怎么格式化电脑吗,电脑怎么格式化
  17. 【场景削减】拉丁超立方抽样方法场景削减(Matlab代码实现)
  18. java异常-绝对解决! The valid characters are defined in RFC 7230 and RFC 3986
  19. 什么是云平台,云平台的分类和优势有哪些?
  20. 人工学习之预测2023年考研英语答案分布

热门文章

  1. 【DSP开发】【VS开发】YUV与RGB格式转换
  2. 面向对象基础回顾(二)
  3. JVM_垃圾收集器与内存分配策略01
  4. C++引入抽象基类和纯虚函数的作用和目的
  5. mqtt android封装,Android之MQTT封装使用
  6. 一些琐碎+分不清的知识点
  7. 【编程】为什么不能直接对链表头head进行操作?
  8. 【Python】self是干啥的?
  9. 科大星云诗社动态20210409
  10. cad常用字体_2300多种CAD字体免费送给你!绘图必备,一键解决你的CAD文字乱码问题...