"인문정보학2020기말준비"의 두 판 사이의 차이

phj
이동: 둘러보기, 검색
245번째 줄: 245번째 줄:
 
http://dh.aks.ac.kr/~sandbox/cgi-bin/Story01.py?db='자기_데이터베이스'&project=friends&key=DH201
 
http://dh.aks.ac.kr/~sandbox/cgi-bin/Story01.py?db='자기_데이터베이스'&project=friends&key=DH201
  
 +
</pre>
 +
 +
* 테이블 만들기, 트리거, 뷰, 조인, 조인해서 인덱스, select문 만들기  등등
 +
 +
# 5개 작품의 한글제목, 작가이름, 소장기관을 보이시오.
 +
# 작가는 각각 몇 점의 그림을 그렸나요? (※ count() 함수 사용)
 +
# 5개 작품의 작품설명(‘설명’) 속에 나오는 모든 ‘지명’을 작품별로 보이시오.
 +
# 5개 작품의 xml 문서에 포함된 모든 ‘인명’을 작품별로 보이시오.
 +
# 5개 작품의 id, 한글제목, 한자제목, 작가이름, 작품설명(‘설명’)을 보이시오. (※ join 문 사용)
 +
<pre>
 +
use s_phj
 +
 +
select * from paintings_xml
 +
 +
create table paintings_xml(
 +
id nvarchar(10),
 +
xmltxt xml,
 +
primary key(id)
 +
)
 +
 +
paintings_getid
 +
 +
create trigger paintings_getid on paintings_xml instead of insert
 +
as
 +
insert into paintings_xml(id, xmltxt)
 +
select
 +
that.xmltxt.value('(//./@id)[1]', 'nvarchar(20)') as id,
 +
that.xmltxt as xmltxt
 +
from inserted that
 +
 +
insert into paintings_xml(xmltxt) values
 +
(N'<개체 id="w05">
 +
<표제>
 +
<이름 표기="국문">김대성과 석굴암</이름>
 +
<이름 표기="한자">石窟庵 創建圖</이름>
 +
</표제>
 +
<범주>
 +
<프로젝트>민족기록화</프로젝트>
 +
<클래스>작품</클래스>
 +
<기여 역할="작성">박성희</기여>
 +
</범주>
 +
<속성 틀="작품정보">
 +
<작가>이종상</작가>
 +
<제작>1979년</제작>
 +
<규격>290.9x197cm(300호)</규격>
 +
<소장처>한국학중앙연구원</소장처>
 +
</속성>
 +
<설명>
 +
        <문단><시대>신라</시대> <인명 id="인물-김대성">김대성(金大城 700~774)</인명>의 설화를 묘사한 민족기록화.</문단>
 +
<문단><서명 id="문헌-삼국유사">『삼국유사』</서명> 권5 효선(孝善)편에 "대성이 현생의 부모를 위해 <지명 id="공간-불국사">불국사</지명>를 창건하고 전세의 부모를 위해 <지명 id="공간-석굴암">석불사(石佛寺:석굴암)</지명>를 창건하여 <인명 id="인물-신림">신림(神琳)</인명> <인명 id="인물-표훈">표훈(表訓)</인명> 두 스님을 청해 각각 머물게 했다"고 적혀 있다.</문단>
 +
</설명>
 +
<시각>
 +
<삽도 url="w05m.jpg">김대성과 석굴암</삽도>
 +
<온라인참조 url="http://digerati.aks.ac.kr/Gallery/Exhibition2016-1/index.htm" >민족기록화 가상전시관</온라인참조>
 +
</시각>
 +
<연관>
 +
<관련항목 rel="~이 그렸다" id="작가-이종상" />
 +
<관련항목 rel="~을 담았다" id="인물-김대성"/>
 +
<관련항목 rel="~을 담았다" id="인물-신림"/>
 +
<관련항목 rel="~을 담았다" id="인물-표훈"/>
 +
<관련항목 rel="~을 담았다" id="공간-석굴암"/>
 +
<관련항목 rel="~에 있다" id="기관-한국학중앙연구원"/>
 +
<관련항목 rel="~와 관련있다" id="공간-불국사"/>
 +
<관련항목 rel="~와 관련있다" id="문헌-삼국유사"/>
 +
</연관>
 +
</개체>')
 +
 +
create view paintings_tbl as
 +
select
 +
id,
 +
xmltxt.value('(/개체/표제/이름)[1]', 'nvarchar(80)') as 한글제목,
 +
xmltxt.value('(/개체/표제/이름)[2]', 'nvarchar(80)') as 한자제목,
 +
xmltxt.value('(/개체/속성/작가)[1]', 'nvarchar(20)') as 작가이름,
 +
xmltxt.value('(/개체/속성/제작)[1]', 'nvarchar(20)') as 제작년도,
 +
xmltxt.value('(/개체/속성/규격)[1]', 'nvarchar(20)') as 작품규격,
 +
xmltxt.value('(/개체/속성/소장처)[1]', 'nvarchar(20)') as 소장기관
 +
from paintings_xml
 +
 +
select * from paintings_tbl
 +
 +
select 한글제목, 작가이름, 소장기관 from paintings_tbl
 +
 +
select 작가이름, count(*) as 빈도 from paintings_tbl
 +
group by 작가이름
 +
 +
 +
 +
select paintings_tbl.한글제목 ,paintings_xml.xmltxt.query('//지명') from paintings_xml
 +
join paintings_tbl on paintings_xml.id=paintings_tbl.id
 +
 +
select paintings_tbl.한글제목 ,paintings_xml.xmltxt.query('//인명') from paintings_xml
 +
join paintings_tbl on paintings_xml.id=paintings_tbl.id
 +
 +
select paintings_tbl.한글제목, node.value('.', 'nchar(80)' ) as 지명
 +
from paintings_xml CROSS APPLY xmltxt.nodes('//지명') as R(node)
 +
join paintings_tbl on paintings_xml.id=paintings_tbl.id
 +
 +
select paintings_tbl.한글제목, node.value('.', 'nchar(80)' ) as 인명
 +
from paintings_xml CROSS APPLY xmltxt.nodes('//인명') as R(node)
 +
join paintings_tbl on paintings_xml.id=paintings_tbl.id
 +
 +
select paintings_xml.id, paintings_tbl.한글제목, paintings_tbl.작가이름, paintings_xml.xmltxt.value('(//설명)[1]','nvarchar(256)') as 작품설명
 +
from paintings_xml
 +
join paintings_tbl on paintings_xml.id=paintings_tbl.id
 
</pre>
 
</pre>

2020년 12월 8일 (화) 00:05 판

  • 데이터베이스란?다수의 응용 시스템들이 사용하기 위해 체계적으로 편성, 저장된 데이터의 집합.
  • DBMS란? 응용프로그램과 데이터의 중재자인 소프트웨어로 모든 응용 프로그램들이 데이터베이스에 접근하여 공동으로 활용할 수 있게끔 관리(정의, 조작, 제어)해 줌.
  • Xml enabled DBMS? XML 지원 데이터베이스는 XML 언어로 쓰여진 데이터를 담을 수 있는 기능을 지원해 주는 DBMS임.
  • 데이터베이스 기술의 활용이 인문학 연구에 어떠한 도움을 줄 수 있는가? 인문지식을 담고 있는 언어를 컴퓨터가 읽을 수 있는 ‘데이터’로 전환하여 더욱 의미있는 활용 가치를 창출해 낼 수 있음.
  • xml table 만들기
create table 테이블이름넣기 (
id nvarchar(20) not null,
xmltxt xml,
primary key(id)
)
  • 다른db에서 복사해서 내 테이블에 적제하기
insert into 새로만든 내 테이블
select * from 디비.dbo.테이블이름

테이블만들지 않고 그대로 복사할 경우는 아래
select * into xmltable3 from Class2020.dbo.xmltable3 
  • 테이블을 만들어서 자료복사해서 넣기
create table 남한산성_xml(
xid nvarchar(8) not null,
xmltxt xml null,
primary key(xid)
)

create table 남한산성_geo(
gid nvarchar(40) not null,
gtype nvarchar(16) null,
address nvarchar(80) null,
longtitude nvarchar(8) null,
latitude nvarchar(8) null,
primary key(gid)
)

insert into 남한산성_xml
 select * from common.dbo.남한산성_xml

insert into 남한산성_geo
 select * from common.dbo.남한산성_geo

create view 남한산성_meta as
select 
xid,
	xmltxt.value('(/항목/항목명/한글항목명)[1]', 'nvarchar(80)') as title,
	xmltxt.value('(/항목/항목명/한자항목명)[1]', 'nvarchar(80)') as hanja, 
	xmltxt.value('(/항목/메타데이터/대표분야)[1]', 'nvarchar(20)') as category, 
	xmltxt.value('(/항목/메타데이터/대표유형)[1]', 'nvarchar(20)') as gtype, 
	xmltxt.value('(/항목/메타데이터/표준시대)[1]', 'nvarchar(20)') as era, 
	xmltxt.value('(/항목/메타데이터/위치/공간/@식별자)[1]', 'nvarchar(40)') as gid
from 남한산성_xml 


select 남한산성_meta.xid, 남한산성_meta.title, 남한산성_meta.gid, 
남한산성_meta.gtype, 남한산성_geo.longtitude, 남한산성_geo.latitude 
from 남한산성_meta, 남한산성_geo where 남한산성_meta.gid = 남한산성_geo.gid

  • 항목명/주소/경도/위도/항목/ xmltxt 뷰만들기
create view jeju_meta as
select id, 
  xmltxt.value('(//항목명)[1]','nvarchar(40)') as 항목명,
  xmltxt.value('(//메타데이터/주소)[1]','nvarchar(40)') as 주소,
  xmltxt.value('(//메타데이터/위도/경도)[1]','float') as 경도,
  xmltxt.value('(//메타데이터/위도/위도)[1]','float') as 위도,
  xmltxt.query('/항목') as xml
 from jeju_xml
  • xml data 넣기
insert into xmltable3 (xmltxt) values
(N' xml 원본넣기 ')
  • 트리거
create trigger xmltable3getid on xmltable3 instead of insert
as /*as 아래와같이 동작하라*/
	insert into xmltable3(id, xmltxt)
	select
		that.xmltxt.value('(//./@id)[1]', 'nvarchar(20)') as id,
		that.xmltxt as xmltxt	/* this, that 모두 상관없음 지금 입력되고 있는 그 테이블*/
	from inserted that
  • 업데이트
update xmltable3
set xmltxt=N'업데이트내용'
where  id='작가-강학태' /*바꾸고 싶은 곳 지정해주기*/
  • xml에서 필요한 자료 추출 및 view 만들기
/* 종합: XML 문서로부터 데이터 활용에 필요한 메타데이터 추출 */ 

select id,
	xmltxt.value('(//범주/프로젝트)[1]', 'nvarchar(40)') as projcet,
	xmltxt.value('(//범주/클래스)[1]', 'nvarchar(40)') as class,
	xmltxt.value('(//표제/이름[./@표기="국문"])[1]', 'nvarchar(40)') as hangeul,
	xmltxt.value('(//표제/이름[./@표기="한자"])[1]', 'nvarchar(40)') as hanja,
	xmltxt.value('(//표제/이름[./@표기="영문"])[1]', 'nvarchar(80)') as english,
	xmltxt.value('(//속성/@틀)[1]', 'nvarchar(20)') as template,
	xmltxt.value('(//속성/정의)[1]', 'nvarchar(256)') as definition
from xmltable3

/* 추출한 메타데이터를 가상 테이블(뷰, view)에 저장 */ 

create view xmlmeta as
select id,
	xmltxt.value('(//범주/프로젝트)[1]', 'nvarchar(40)') as projcet,
	xmltxt.value('(//범주/클래스)[1]', 'nvarchar(40)') as class,
	xmltxt.value('(//표제/이름[./@표기="국문"])[1]', 'nvarchar(40)') as hangeul,
	xmltxt.value('(//표제/이름[./@표기="한자"])[1]', 'nvarchar(40)') as hanja,
	xmltxt.value('(//표제/이름[./@표기="영문"])[1]', 'nvarchar(80)') as english,
	xmltxt.value('(//속성/@틀)[1]', 'nvarchar(20)') as template,
	xmltxt.value('(//속성/정의)[1]', 'nvarchar(256)') as definition
from xmltable3

select * from xmlmeta
  • join을 써서 보여주고싶은 데이터 보여주기
/*클라스가 사건인 데이타를 뽑아내고싶다*/
select * from xmlmeta
where class='사건'

/*클라스가 사건인 데이타를 뽑아내어 xmltable3도 같이 보여줘라, 다보고싶으면 where 빼고*/
select xmlmeta.*,xmltxt.query('//속성'), xmltxt.query('//개설') from xmlmeta
join xmltable3 on xmlmeta.id=xmltable3.id
where class='사건'
  • join을 써서 뷰를 만들기
CREATE VIEW jeju_meta_xml AS
SELECT jeju_meta.id, 항목명, 경도, 위도, xmltxt
FROM jeju_meta
JOIN jeju_xml ON jeju_meta.id = jeju_xml.id


  • 인덱스(CROSS APPLY)를 만들어서 VIEW 만들기
create view xmltable3_인명 as
	select id, node.value('.', 'nchar(80)' ) as 인명, node.value('./@id', 'nchar(80)' ) as 인명_id
	from xmltable3 CROSS APPLY xmltxt.nodes('//인명') as R(node) 

/*인덱스를 만들어서 xmltxt에 query값으로 넣기*/
insert into jeju_xml(xmltxt)
	select node.query('.') as 항목
	from jeju_bulk CROSS APPLY xmltxt.nodes('//항목') as R(node) 
  • 빈도 찾아보기
select 용어, 용어_id, count(*) as 빈도
 from xmltable3_용어
 group by 용어, 용어_id
 order by 용어, 용어_id
  • 네트워크그래프 기본 포멧
/*항상 기본 포멧으로 쓰기,shell그래프노드를 표현가능, 샌드박스의 파이선 프로그램 쓰기*/
CREATE TABLE shellData (
	id nvarchar(40) NOT NULL,
	class nvarchar(40) NULL,
	groupName nvarchar(40) NULL,
	partName nvarchar(40) NULL,
	label nvarchar(80) NULL,
	hangeul nvarchar(80) NULL,
	hanja nvarchar(80) NULL,
	english nvarchar(160) NULL,
	infoUrl nvarchar(256) NULL,
	iconUrl nvarchar(256) NULL,
    PRIMARY KEY(id)
)
CREATE TABLE shellLinks (
	source nvarchar(40) NOT NULL,
	target nvarchar(40) NOT NULL,
	relation nvarchar(40) NOT NULL,
	attribute nvarchar(80) NULL,
	PRIMARY KEY(source, target, relation)
)
/*자료넣기*/
insert into friendsData (id, class, groupName, label )
values
('김현', 'Actor', '교수', '김현'),
('박현정', 'Actor', '학생', '박현정'),/*아이디가 박현정인 노드는 클래스가 액터이고 그룹네임이 학생이고 라벨이 박현정이다*/
('정송이', 'Actor', '학생', '정송이'),
('강훈혁', 'Actor', '학생', '강훈혁'),
('김수현', 'Actor', '학생', '김수현'),
('이정민', 'Actor', '학생', '이정민'),
('최원재', 'Actor', '학생', '최원재'),
('조원희', 'Actor', '교수', '조원희'),
('DH201', 'Event', '수업', '수업:인문정보 데이터베이스'),
('한중연', 'Actor', '기관', '한국학중앙연구원'),
('한국학대학원', 'Actor', '기관', '한국학대학원')
('디지털인문학연구소', 'Actor', '기관', '디지털인문학연구소')

insert into friendsLinks(source, target, relation)
values
('김현', '한국학대학원', '~의 교수이다'),
('조원희', '한국학대학원', '~의 교수이다'),
('박현정', '한국학대학원', '~의 학생이다'),
('정송이', '한국학대학원', '~의 학생이다'),
('강훈혁', '한국학대학원', '~의 학생이다'),
('김수현', '한국학대학원', '~의 학생이다'),
('이정민', '한국학대학원', '~의 학생이다'),
('최원재', '한국학대학원', '~의 학생이다'),
('한중연', '한국학대학원', '부속기구 ~가 있다'),
('한중연', '디지털인문학연구소', '부속기구 ~가 있다'),
('한국학대학원', 'DH201', '교과목 ~를 개설하다'),
('김현', 'DH201', '~를 강의하다'),
('조원희','DH201', '~를 수강하다'),
('박현정', 'DH201', '~를 수강하다'),
('정송이', 'DH201', '~를 수강하다'),
('강훈혁', 'DH201', '~를 수강하다'),
('김수현', 'DH201', '~를 수강하다'),
('이정민', 'DH201', '~를 수강하다'),
('최원재', 'DH201', '~를 수강하다'),
('조원희',  'DH201', '~를 수강하다'),
('김현',  '디지털인문학연구소', '~의 소장이다'),
('박현정', '디지털인문학연구소', '~의 연구원이다'),
('정송이', '디지털인문학연구소', '~의 연구원이다')

/*관행적으로 첫글자는 대문자로 쓰기, 파이선이 인식하려면 프로젝트명+Data(노드)와 프로젝트명+Link(링크)는 절대 바꾸면 안됨*/
select * from friendsData
select * from friendsLinks

/*네트워크 그래프 출력*/
http://dh.aks.ac.kr/~sandbox/cgi-bin/Story01.py?db='자기_데이터베이스'&project=friends&key=DH201

  • 테이블 만들기, 트리거, 뷰, 조인, 조인해서 인덱스, select문 만들기 등등
  1. 5개 작품의 한글제목, 작가이름, 소장기관을 보이시오.
  2. 작가는 각각 몇 점의 그림을 그렸나요? (※ count() 함수 사용)
  3. 5개 작품의 작품설명(‘설명’) 속에 나오는 모든 ‘지명’을 작품별로 보이시오.
  4. 5개 작품의 xml 문서에 포함된 모든 ‘인명’을 작품별로 보이시오.
  5. 5개 작품의 id, 한글제목, 한자제목, 작가이름, 작품설명(‘설명’)을 보이시오. (※ join 문 사용)
use s_phj

select * from paintings_xml

create table paintings_xml(
	id nvarchar(10), 
	xmltxt xml,
	primary key(id)
)

paintings_getid

create trigger paintings_getid on paintings_xml instead of insert
as 
	insert into paintings_xml(id, xmltxt)
	select
		that.xmltxt.value('(//./@id)[1]', 'nvarchar(20)') as id,
		that.xmltxt as xmltxt	
	from inserted that

insert into paintings_xml(xmltxt) values
(N'<개체 id="w05">
	<표제>
		<이름 표기="국문">김대성과 석굴암</이름>
		<이름 표기="한자">石窟庵 創建圖</이름>
	</표제>
	<범주>
		<프로젝트>민족기록화</프로젝트>
		<클래스>작품</클래스>
		<기여 역할="작성">박성희</기여>
	</범주>
	<속성 틀="작품정보">
		<작가>이종상</작가>
		<제작>1979년</제작>	
		<규격>290.9x197cm(300호)</규격>
		<소장처>한국학중앙연구원</소장처>
	</속성>
	<설명>
        <문단><시대>신라</시대> <인명 id="인물-김대성">김대성(金大城 700~774)</인명>의 설화를 묘사한 민족기록화.</문단> 
		<문단><서명 id="문헌-삼국유사">『삼국유사』</서명> 권5 효선(孝善)편에 "대성이 현생의 부모를 위해 <지명 id="공간-불국사">불국사</지명>를 창건하고 전세의 부모를 위해 <지명 id="공간-석굴암">석불사(石佛寺:석굴암)</지명>를 창건하여 <인명 id="인물-신림">신림(神琳)</인명> <인명 id="인물-표훈">표훈(表訓)</인명> 두 스님을 청해 각각 머물게 했다"고 적혀 있다.</문단>
	</설명>
	<시각>
		<삽도 url="w05m.jpg">김대성과 석굴암</삽도>
		<온라인참조 url="http://digerati.aks.ac.kr/Gallery/Exhibition2016-1/index.htm" >민족기록화 가상전시관</온라인참조>
	</시각>
	<연관>
		<관련항목 rel="~이 그렸다" id="작가-이종상" />
		<관련항목 rel="~을 담았다" id="인물-김대성"/>
		<관련항목 rel="~을 담았다" id="인물-신림"/>
		<관련항목 rel="~을 담았다" id="인물-표훈"/>
		<관련항목 rel="~을 담았다" id="공간-석굴암"/>
		<관련항목 rel="~에 있다" id="기관-한국학중앙연구원"/>
		<관련항목 rel="~와 관련있다" id="공간-불국사"/>
		<관련항목 rel="~와 관련있다" id="문헌-삼국유사"/>
	</연관>
</개체>')

create view paintings_tbl as
select 
 id,
	xmltxt.value('(/개체/표제/이름)[1]', 'nvarchar(80)') as 한글제목,
	xmltxt.value('(/개체/표제/이름)[2]', 'nvarchar(80)') as 한자제목, 
	xmltxt.value('(/개체/속성/작가)[1]', 'nvarchar(20)') as 작가이름, 
	xmltxt.value('(/개체/속성/제작)[1]', 'nvarchar(20)') as 제작년도, 
	xmltxt.value('(/개체/속성/규격)[1]', 'nvarchar(20)') as 작품규격, 
	xmltxt.value('(/개체/속성/소장처)[1]', 'nvarchar(20)') as 소장기관
from paintings_xml 

select * from paintings_tbl 

select 한글제목, 작가이름, 소장기관 from paintings_tbl

select 작가이름, count(*) as 빈도 from paintings_tbl
group by 작가이름



select paintings_tbl.한글제목 ,paintings_xml.xmltxt.query('//지명') from paintings_xml 
join paintings_tbl on paintings_xml.id=paintings_tbl.id

select paintings_tbl.한글제목 ,paintings_xml.xmltxt.query('//인명') from paintings_xml 
join paintings_tbl on paintings_xml.id=paintings_tbl.id

select paintings_tbl.한글제목, node.value('.', 'nchar(80)' ) as 지명
	from paintings_xml CROSS APPLY xmltxt.nodes('//지명') as R(node) 
	join paintings_tbl on paintings_xml.id=paintings_tbl.id

select paintings_tbl.한글제목, node.value('.', 'nchar(80)' ) as 인명
	from paintings_xml CROSS APPLY xmltxt.nodes('//인명') as R(node) 
	join paintings_tbl on paintings_xml.id=paintings_tbl.id

select paintings_xml.id, paintings_tbl.한글제목, paintings_tbl.작가이름, paintings_xml.xmltxt.value('(//설명)[1]','nvarchar(256)') as 작품설명
from paintings_xml 
join paintings_tbl on paintings_xml.id=paintings_tbl.id