Category: JENA

May 08 2009

[JENA] Tutorial – Controlling Prefixes

Tutorial 5 에 이어 Controlling Prefixes 설명 부분이다.

전에 정의한 네임스페이스를 전처리기 처럼 미리 정의하여 코드를 간략히 하는 예제이다.
Jena는 이러한 긴 URI들을 간략히 하여 표현하는 간단한 예제를 보여준다.

//모델 생성
Model m = ModelFactory.createDefaultModel();

//스트링형 URIs
String nsA = “http://hacks.wo.to/ju0e#”;
String nsB = “http://hackscd.goanygate.com/ju0e#”;

//리소스 생성
Resource root = m.createResource( nsA + “root” );

//프로퍼티 생성
Property P = m.createProperty( nsA + “P” );
Property Q = m.createProperty( nsB + “Q” );
Property x = m.createProperty( nsA + “x” );
Property y = m.createProperty( nsA + “y” );
Property z = m.createProperty( nsA + “z” );

//모델 등록
m.add( root, P, x )
.add( root, P, y )
.add( y, Q, z );

System.out.println( “# — no special prefixes defined” );
m.write( System.out );
System.out.println( “# — nsA defined” );

//네임스페이스 세팅
m.setNsPrefix( “nsA”, nsA );

m.write( System.out );
System.out.println( “# — nsA and cat defined” );

//네임스페이스 세팅
m.setNsPrefix( “cat”, nsB );

m.write( System.out );

결과는 코드에 비해 상당히 많은 내용들이 출력되어 진다.

# — no special prefixes defined
<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:j.0=”http://hackscd.goanygate.com/ju0e#”
xmlns:j.1=”http://hacks.wo.to/ju0e#” >
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#root“>
<j.1:P rdf:resource=”http://hacks.wo.to/ju0e#y”/>
<j.1:P rdf:resource=”http://hacks.wo.to/ju0e#x”/>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#y“>
<j.0:Q rdf:resource=”http://hacks.wo.to/ju0e#z”/>
</rdf:Description>
</rdf:RDF>

# — nsA defined
<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:j.0=”http://hackscd.goanygate.com/ju0e#”
xmlns:nsA=”http://hacks.wo.to/ju0e#” >
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#root“>
<nsA:P rdf:resource=”http://hacks.wo.to/ju0e#y”/>
<nsA:P rdf:resource=”http://hacks.wo.to/ju0e#x”/>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#y“>
<j.0:Q rdf:resource=”http://hacks.wo.to/ju0e#z”/>
</rdf:Description>
</rdf:RDF>

# — nsA and cat defined
<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:cat=”http://hackscd.goanygate.com/ju0e#”
xmlns:nsA=”http://hacks.wo.to/ju0e#” >
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#root“>
<nsA:P rdf:resource=”http://hacks.wo.to/ju0e#y”/>
<nsA:P rdf:resource=”http://hacks.wo.to/ju0e#x”/>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e#y“>
<cat:Q rdf:resource=”http://hacks.wo.to/ju0e#z”/>
</rdf:Description>
</rdf:RDF>

May 07 2009

[JENA] Tutorial05

Reading RDF

Tutorial 5 는 모델로부터 RDF에 있는 내용을 읽는법을 설명한다.
이미 만들어져 있는 RDF파일을 InputStream형태의 객체로 읽어 화면에 출력해주는 간단한 내용이다.

파일메니저를 이용하여 RDF파일을 읽는다.
InputStream in = FileManager.get().open(inputFileName);

만약 파일이 없다면 IllegalArgumentException오류를 발생하도록 한다.
if(in == null) {
throw new IllegalArgumentException(” RDF File not found”);
}

RDF/XML파일을 읽는 메소드로 RDF 내용을 읽어온다.
model.read(in, “”);

Tutorial04에서 표준으로 화면에 쓰는 메소드를 사용하여 읽어온 내용을 확인한다.
model.write(System.out);

[ SOURCE : vc-db-1.rdf ]

<rdf:RDF
xmlns:rdf=’http://www.w3.org/1999/02/22-rdf-syntax-ns#’
xmlns:vCard=’http://www.w3.org/2001/vcard-rdf/3.0#’
>

<rdf:Description rdf:about=”http://hacks.wo.to/ju0e/“>
<vCard:FN>Ju-young Noh</vCard:FN>
<vCard:N rdf:parseType=”Resource”>
<vCard:Family>Noh</vCard:Family>
<vCard:Given>Ju-young</vCard:Given>
</vCard:N>
</rdf:Description>

<rdf:Description rdf:about=”http://hacks.wo.to/phd/“>
<vCard:FN>Hae-dong Park</vCard:FN>
<vCard:N rdf:parseType=”Resource”>
<vCard:Family>Park</vCard:Family>
<vCard:Given>Hae-dong</vCard:Given>
</vCard:N>
</rdf:Description>

<rdf:Description rdf:about=”http://hacks.wo.to/hjy/“>
<vCard:FN>Jong-hyun</vCard:FN>
<vCard:N rdf:parseType=”Resource”>
<vCard:Family>Ha</vCard:Family>
<vCard:Given>Jong-hyun</vCard:Given>
</vCard:N>
</rdf:Description>

<rdf:Description rdf:about=”http://hacks.wo.to/kjw/“>
<vCard:FN>Jun-wook Kang</vCard:FN>
<vCard:N
vCard:Family=”Kang”
vCard:Given=”Jun-wook”/>
</rdf:Description>

</rdf:RDF>

[ SOURCE : Tutorial05.java ]

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.util.*;

import java.io.*;

public class Test extends Object
{
static final String inputFileName = “data/vc-db-1.rdf”;

public static void main(String args[])
{
Model model = ModelFactory.createDefaultModel();

InputStream in = FileManager.get().open(inputFileName);
if(in == null)
{
throw new IllegalArgumentException(” File : ” + inputFileName + ” not found”);
}

model.read(in, “”);
model.write(System.out);
}
}

[ EXECUTE ]

<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:vCard=”http://www.w3.org/2001/vcard-rdf/3.0#” >
<rdf:Description rdf:about=”http://hacks.wo.to/hjy/“>
<vCard:N rdf:nodeID=”A0″/>
<vCard:FN>Jong-hyun</vCard:FN>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/phd/“>
<vCard:N rdf:nodeID=”A1″/>
<vCard:FN>Hae-dong Park</vCard:FN>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/kjw/“>
<vCard:N rdf:nodeID=”A2″/>
<vCard:FN>Jun-wook Kang</vCard:FN>
</rdf:Description>
<rdf:Description rdf:nodeID=”A3″>
<vCard:Given>Ju-young</vCard:Given>
<vCard:Family>Noh</vCard:Family>
</rdf:Description>
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e/“>
<vCard:N rdf:nodeID=”A3″/>
<vCard:FN>Ju-young Noh</vCard:FN>
</rdf:Description>
<rdf:Description rdf:nodeID=”A2″>
<vCard:Given>Jun-wook</vCard:Given>
<vCard:Family>Kang</vCard:Family>
</rdf:Description>
<rdf:Description rdf:nodeID=”A1″>
<vCard:Given>Hae-dong</vCard:Given>
<vCard:Family>Park</vCard:Family>
</rdf:Description>
<rdf:Description rdf:nodeID=”A0″>
<vCard:Given>Jong-hyun</vCard:Given>
<vCard:Family>Ha</vCard:Family>
</rdf:Description>
</rdf:RDF>

May 06 2009

[JENA] Tutorial04

Writing RDF

Jena에서는 RDF로 쓰고 읽는 것을 XML형태로 볼 수 있다.
XML형태로 출력되는 것을 확인해보자.
구분은 아래와 같이 간단하다.

model.write(System.out)’;

Tutorial03에서 N-Triples 형태로 보기위해 get 함수를 이용하였다.
Jena에 기록되는 내용을 XML로 화면에 출력하고 모델에 기록하는 코드이다.

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;

public class Test extends Object
{
static String personURI  = “http://hacks.wo.to/ju0e“;
static String hacksName  = “Ju-young Noh”;
static String hacksEmail1 = “hacks@korea.com“;
static String hacksEmail2 = “hacks@hacks.wo.to“;
static String title   = “An Introduction to RDF and the Jena API”;
static String date   = “13/8/2006″;

public static void main(String args[])
{
String personURI = “http://hacks.wo.to/ju0e“;
String givenName = “Ju-young”;
String familyName = “Noh”;
String fullName  = givenName + ” ” + familyName;

Model model = ModelFactory.createDefaultModel();

Resource ju0e
= model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));

model.write(System.out);
}
}

model.write(System.out); 구분에 RDF/XML-ABREV 나 N-TRIPLE을 사용하면 XML형태를 다르게도 표현할 수 있다.

위 코드의 결과는 기본값으로 출력물이 길고 복잡하다.

<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:vcard=”http://www.w3.org/2001/vcard-rdf/3.0#” >
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e“>
<vcard:N rdf:nodeID=”A0″/>
<vcard:FN>Ju-young Noh</vcard:FN>
</rdf:Description>
<rdf:Description rdf:nodeID=”A0″>
<vcard:Family>Noh</vcard:Family>
<vcard:Given>Ju-young</vcard:Given>
</rdf:Description>
</rdf:RDF>

만약 model.write(System.out, “RDF/XML-ABBREV”); 를 사용하게 된다면 심플한 형태로 축약되어 결과를 볼 수 있다.

<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:vcard=”http://www.w3.org/2001/vcard-rdf/3.0#”>
<rdf:Description rdf:about=”http://hacks.wo.to/ju0e“>
<vcard:N rdf:parseType=”Resource”>
<vcard:Family>Noh</vcard:Family>
<vcard:Given>Ju-young</vcard:Given>
</vcard:N>
<vcard:FN>Ju-young Noh</vcard:FN>
</rdf:Description>
</rdf:RDF>

model.write(System.out, “N-TRIPLE”); 을 사용하게 되면 결과를 N-TRIPLE 형태로 볼 수 있다.

_:A302520d0X3aX10d06c16345X3aXX2dX8000 <http://www.w3.org/2001/vcard-rdf/3.0#Family> “Noh” .
_:A302520d0X3aX10d06c16345X3aXX2dX8000 <http://www.w3.org/2001/vcard-rdf/3.0#Given> “Ju-young” .
<http://hacks.wo.to/ju0e> <http://www.w3.org/2001/vcard-rdf/3.0#N> _:A302520d0X3aX10d06c16345X3aXX2dX8000 .
<http://hacks.wo.to/ju0e> <http://www.w3.org/2001/vcard-rdf/3.0#FN> “Ju-young Noh” .

N-TRIPLE 형태로 보게 될  때 결과에서 알수 없는 부분이 출력되는 것은 Jena에서 임의로 노드를 지정한 것이다.

May 05 2009

[JENA] Tutorial03

Resource, Property, Value(Resource)를 구현한 내용을 N-Triples 형태로 보도록 하자.
Tutorial02 소스에 출력부분을 추가하면 된다.

// list the statements in the Model
StmtIterator iter = model.listStatements();

// print out the predicate, subject and object of each statement
while(iter.hasNext()) {
Statement stmt  = iter.nextStatement();      // get next statement
Resource subject = stmt.getSubject();       // get the subject
Property predicate = stmt.getPredicate();   // get the predicate
RDFNode object  = stmt.getObject();         // get the object
System.out.println();
System.out.println(”ⓡ ” + subject.toString());
System.out.println(”ⓟ ” + predicate.toString());
if(object instanceof Resource) {
System.out.println(”ⓥ ” + object.toString());
} else {
System.out.println(”ⓡ ” + “”" + object.toString() + “”");
}
}

get을 이용하여 해당 위치의 값을 가져와서 화면에 출력해주는 내용이다.
출력되는 화면은 N-Triples 형태로 출력된다.

본래의 소스에서 출력형태를 보기 쉽도록 약간 수정하였다.
ⓡ은 Resource, ⓟ는 Property, ⓥ는 Value를 의미한다.
Value위치의 값이 Value가 될 경우 “”안에 표기되어 출력된다.
총 4개의 N-Triples로 구성된 것을 알 수 있다.

다시 말하면 기본 R-P-V 형태이지만 R-P-R형태로 자원이 자원을 가리킬 수 있도록 의미를 부여한다.
알아볼 수 없는 문자들은 Namespace가 지정돼지 않았기 때문에 Jena에서 임의적으로 부여한 것이다.

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;

public class Test extends Object
{
static String personURI = “http://hacks.wo.to/ju0e”;
static String givenName = “Ju-young”;
static String familyName = “Noh”;
static String fullName = givenName + ” ” + familyName;
public static void main(String args[]) {
Model model = ModelFactory.createDefaultModel();
Resource ju0e = model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
StmtIterator iter = model.listStatements();
while(iter.hasNext()) {
Statement stmt = iter.nextStatement();
Resource subject = stmt.getSubject();
Property predicate = stmt.getPredicate();
RDFNode object = stmt.getObject();
System.out.println();
System.out.println(”ⓡ ” + subject.toString());
System.out.println(”ⓟ ” + predicate.toString());
if(object instanceof Resource) {
System.out.println(”ⓡ ” + object.toString());
} else {
System.out.println(”ⓥ ” + “”" + object.toString() + “”");
}
}
}
}

May 04 2009

[JENA] Tutorial02

이번에는 RDF의 기본적 개념을 활용하여
Resource ── Property ─→ Resource 를 추가해보도록 한다.
Tutorial01의 소스에 약간만 추가하면 된다.

// some definitions
String personURI = “http://hacks.wo.to/ju0e“;
String givenName = “Ju-young”;
String familyName = “Noh”;
String fullName = givenName + ” ” + familyName;

// create an empty Model
Model model = ModelFactory.createDefaultModel();

// create the resource
// and add the properties cascading style
Resource johnSmith
= model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;

public class Tutorial02 extends Object {

public static void main (String args[]) {
String personURI = “http://hacks.wo.to/ju0e“;
String givenName = “Ju-young”;
String familyName = “Noh”;
String fullName = givenName + ” ” + familyName;

Model model = ModelFactory.createDefaultModel();

Resource johnSmith
= model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
}
}

May 03 2009

[JENA] Tutorial01

Jena Tutorial에 입문하기 앞서 간단한 RDF 구조를 알아보도록 하자.

RDF는 Resource Description Framework의 약어로 W3C에서 자원을 기술하기 위한 표준 프레임워크다.
기본적인 형태를 보면 Resource → Value 형태를 취한다.
기존의 웹 기반에서는 자원이 있다면 의미 없는 단지 링크로서의 값을 가지게 된다.
여기에 의미를 부여하여 컴퓨터가 의미를 이해하고 의미를 조작할 수 있도록 한 것이다.
이것이 Semantic웹이라 한다.

Jena Tutorial01

RDF의 기본 형태는 Resource ── Property ─→ Value 형태.
Jena를 이용해 이 형태를 만드려면 model과 Resource를 생성해야 한다.
그리고 Resource에 Property를 추가해주는 것으로 이루어 진다.

Resource에 URI를 넣고, Value에 사람 이름을 입력하도록 한다.

// some definitions
static String personURI = “http://hacks.wo.to/ju0e“;
static String fullName = “Ju-young Noh”;

아래부분은 기본적인 코드가 된다.

// create an empty Model
Model model = ModelFactory.createDefaultModel();

// create the resource
Resource ju0e = model.createResource(personURI);

// add the property
ju0e.addProperty(VCARD.FN, fullName);

Resource와 Property는 아래와 같이 쓸 수 있다.

// compactly written in a cascading style
Resource ju0e = model.createResource(personURI)
.addProperty(VCARD.FN, fullName);

import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.vocabulary.*;

public class Tutorial01 extends Object {
static String personURI    = “http://somewhere/JohnSmith“;
static String fullName     = “John Smith”;

public static void main (String args[]) {
Model model = ModelFactory.createDefaultModel();

Resource johnSmith = model.createResource(personURI);

johnSmith.addProperty(VCARD.FN, fullName);
}
}

May 02 2009

[JENA] Jena 2.4 for Windows

Jena 2.4 for Windows

Jena site : jena.sourceforge.net
http://jaist.dl.sourceforge.net/sourceforge/jena/Jena-2.4.zip

① unzip the distribution file into a convernient directory.
ex) C:Jena-2.4

② set the Java classpath to include all the JAR files in the JENAROOT/lib/ directory
(JENAROOT ← C:Jena-2.4)

JENAROOT/lib/jena.jar

JENAROOT/lib/arq.jar
JENAROOT/lib/commons-logging.jar
JENAROOT/lib/xercesImpl.jar
JENAROOT/lib/xml-apis.jar
JENAROOT/lib/icu4j_3_4.jar
JENAROOT/lib/json.jar
JENAROOT/lib/concurrent.jar
JENAROOT/lib/antlr-2.7.5.jar
JENAROOT/lib/junit.jar
JENAROOT/lib/log4j-1.2.12.jar
JENAROOT/lib/wstx-asl-2.8.jar
JENAROOT/lib/stax-api-1.0.jar

③ Test the distribution by running the regression tests

// if you have ant configured to run junit
[CMD] JENAROOT> ant test

// on windows
[CMD] JENAROOT> test.bat

만약 자바를 처음 설치했다면 환경변수를 설정한다.
시스템 등록 정보 > 고급 > 환경 변수 > 시스템 변수에 새로 만들기 버튼을 누르고 java가 설치된 경로를 입력한다.

변수이름 : JAVA_HOME
변수 값 : C:Program FilesJava

Jena 도 편의상 환경변수를 설정하도록 한다.

변수이름 : JENAROOT
변수 값 : C:Jena-2.4

JENAROOTlib 에 있는 모든 JAR파일들을 JAVA_HOMEjrelibext 안에 카피를 하거나, classpath를 설정해준다.

변수이름 : CLASSPATH
변수 값 : %JENAROOT%libjena.jar;%JENAROOT%lib…

문제점 : ant test 나 혹은 test.bat 를 시행하면 Failures : 1이 뜬다.

[junit] Running com.hp.hpl.jena.test.TestPackage
[junit] Tests run: 9983, Failues: 1, Errors: 0, Time elapsed: …
[junit] Test com.hp.hpl.jena.test.TestPackage FAILED

물론 jar파일들을 /lib/ext 에 카피를 해보았지만 같은 증상이다.

WordPress Themes