我正在使用 Java 和 Jena API。
我有一个类 Person
,其数据类型属性为 hasFirstName
、hasLastName
、hasDateOfBirth
、hasGender
。
这是我的 RDF 文件中一个人的表示方式。
<rdf:Description rdf:about="http://www.fam.com/FAM#Bruno04/02/1980 ">
<j.0:FAMhasGender>H</j.0:FAMhasGender>
<j.0:FAMhasDateOfBirth>04/02/1980</j.0:FAMhasDateOfBirth>
<j.0:FAMhasLastName>DS </j.0:FAMhasLastName>
<j.0:FAMhasFirstName> Bruno</j.0:FAMhasFirstName>
</rdf:Description>
对于性别为女性的每个人,我想生成一个包含以下行的文本文件:
[label= \"" +firstName+ " \"\n\n\"D.Naiss:"+dnai1+"\", "+shape2+"]
因此,例如,如果有 3 名女性,文件必须包含 3 行采用该格式。形状值(然后是输出线)将取决于性别,这就是为什么我不能对两种性别使用相同的线。
对于性别为男性的每个人,我想在下面输出这一行:
[label= \"" +firstName+ " \"\n\n\"D.Naiss:"+dnai1+"\", "+**shape**+"]
我遇到的问题是,在输出文件中,我只看到对应行的一位女士和一位男士。我有不止一个女人和男人,但他只为每种性别输出一个。那是我的问题...
相关代码如下:
public void accessProp() {
readFile(inputFile); // rdf
String fname;
String dd;
String gen;
ExtendedIterator instances = onto.person.listInstances();
Individual instance = null;
Individual firstInstance = null;
while (instances.hasNext()) {
instance = (Individual) instances.next();
gen = instance.getPropertyValue(onto.hasGender).toString();
fname = instance.getPropertyValue(onto.hasFirstName).toString();
dd = instance.getPropertyValue(onto.hasDateOfBirth).toString();
writeFile(fname, dd, genr);
}
}
// Write text file
public void writeFile(String fn, String dbir, String gn) {
String fileout = "D:/file1.txt";
String firstName = fn;
String dateB = dbir;
String gender = gn;
BufferedWriter out;
try {
out = new BufferedWriter(new FileWriter(fileout, true));
if (gender.equals("F")) {
out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape + "]");
} else if (gender.equals("M")) {
out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape2 + "]");
}
out.newLine();
// flushes and closes the stream
out.close();
} catch (IOException e) {
System.out.println("There was a problem:" + e);
}
}
你能告诉我应该修改什么来解决我的问题吗?
谢谢
最佳答案
我的拙见是您完全不了解 RDF,并且当您自己无法找出问题所在时,您正在努力通过在 SO 上随机提问来使事情正常进行。这种态度并没有错,但是如果您尝试仔细阅读文档(OWL、RDF 和 Jena) 会更好。
我怀疑问题不在 Java 方面,而是您的本体问题(除非您能证明这不是真的)。
我根本没有使用过 RDF 和 Jena,但是我花了几个小时阅读文档,所以即使下面的方法可能不是做事的最佳方法,但它肯定比你的方法更好。当您无法理解某些内容时,请随意提问(向我或向 SO 社区提问)。首先,让我们用 OWL 编写我们的本体(我是新手,所以这可能包含错误) 注意:您不应该在每次程序运行时都用 Java 代码构建本体。您可能会从如下所示的某种序列化形式加载您的本体
<?xml version="1.0"?>
<!-- See http://www.w3.org/TR/2004/REC-owl-guide-20040210/#Namespaces -->
<!DOCTYPE rdf:RDF [
<!ENTITY fam "http://zybnet.com/fam#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
]>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="&xsd;"
xmlns ="&fam;"
xmlns:fam="&fam;"
xml:base ="&fam;" >
<owl:Class rdf:about="Person" />
<!-- Properties name, gender, and birth -->
<owl:DatatypeProperty rdf:about="&fam;name">
<rdfs:domain rdf:resource="Person" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DatatypeProperty>
<owl:DatatypeProperty rdf:about="&fam;birth">
<rdfs:domain rdf:resource="Person" />
<rdfs:range rdf:resource="&xsd;date" />
</owl:DatatypeProperty>
<owl:DatatypeProperty rdf:about="&fam;gender">
<rdfs:domain rdf:resource="Person" />
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<rdf:Description rdf:about="user/7192">
<fam:name>Bruno</fam:name>
<fam:gender>M</fam:gender>
<fam:birth>19/08/1987</fam:birth>
</rdf:Description>
<rdf:Description rdf:about="user/3023">
<fam:name>Raffaele</fam:name>
<fam:gender>M</fam:gender>
<fam:birth>09/02/1927</fam:birth>
</rdf:Description>
<rdf:Description rdf:about="user/9283">
<fam:name>Angela</fam:name>
<fam:gender>F</fam:gender>
<fam:birth>01/06/1957</fam:birth>
</rdf:Description>
</rdf:RDF>
然后是Java代码
public class RDF {
public static void main(String[] args) {
Model model = ModelFactory.createOntologyModel();
model.read(RDF.class.getResourceAsStream("family.rdf"), null);
System.out.println("All triples in file");
outQuery("SELECT ?subject ?predicate ?object " +
"WHERE { ?subject ?predicate ?object }", model);
System.out.println("A simple query");
outQuery("SELECT ?subject ?name ?gender " +
"WHERE { " +
" ?subject <http://zybnet.com/fam#name> ?name ." +
" ?subject <http://zybnet.com/fam#gender> ?gender ." +
" }", model);
}
private static void outQuery(String q, Model model) {
Query query = QueryFactory.create(q);
QueryExecution execution = QueryExecutionFactory.create(query, model);
ResultSet results = execution.execSelect();
ResultSetFormatter.out(System.out, results, query);
execution.close();
}
}
最后是一些 log4j 配置(这必须放在类路径上的 log4j.properties
中,或者使用 PropertyConfigurator.configure
从 Java 代码加载)
log4j.logger.com.hp.hpl.jena=debug, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %m%n
这应该是您的起始代码。通过运行它,您将看到发生了什么。通过理解这段代码,您将能够重构您的应用程序并找到您要学习的内容以使其启动和运行。祝你好运!
示例输出:(为简洁起见删除了文本)
[Lots of text here...]
A simple query
[DEBUG] Lock : main
-------------------------------------------------------
| uri | name | gender |
=======================================================
| <http://zybnet.com/user/9230> | "Angela" | "F" |
| <http://zybnet.com/user/0239> | "Raffaele" | "M" |
| <http://zybnet.com/user/0001> | "Bruno" | "M" |
-------------------------------------------------------
关于Java - Jena API - 输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236195/