3

Java と Jena API を使用しています。

Person私は、データ型のプロパティを持つクラスを持っていますhasFirstName, hasLastName, hasDateOfBirth, hasGender.

以下は、RDF ファイルで 1 人の人物を表す方法です。

<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**+"]

私が抱えている問題は、出力ファイルに、対応する行を持つ女性と男性が 1 人しか表示されないことです。私には複数の女性と男性がいますが、彼は性別ごとに1つしか出力しません。それは私の問題です...

関連するコードは次のとおりです。

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);
    }
}

問題を解決するには何を変更すればよいか教えていただけますか?

ありがとう

4

2 に答える 2

1

あなたは 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か、Java コードから でロードする必要がありますPropertyConfigurator.configure)

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"    |
-------------------------------------------------------
于 2012-09-02T14:39:09.003 に答える
0

出力ファイルを閉じてwriteFile、このメソッドの最初の呼び出し後にそれ以上データを書き込めないようにします。のメイン ループの後、ファイルを閉じますaccessProp

于 2012-09-02T13:21:38.713 に答える