如何解析包含RDF n-triples的字符串?

时间:2013-09-19 21:14:13

标签: java parsing rdf

我有一个读取rdf n-triples格式的文件。但是,我不允许使用第三方API(如jena等......这是一个不同的辩论)。

但基本上,我可以得到两种字符串:

<foo 1> <bar 1> <foo bar> .
<foo 2> <bar 2> foobar .

所以,我想写一个课程:

void ParseTriples(String s){
   setObject(<foo> part)
   setPredicate(<bar part>)
   setObject(<foobar> or foobar)

}

我所拥有的是一个黑客......

public void setNTriples(String text){
        Pattern pattern = Pattern.compile("<(.*?)>");
        //Pattern pattern = Pattern.compile("<([^>]*)>\\s+[<]?([^>]*)[>]?");
        //Pattern pattern = Pattern.compile("(<[a-zA-Z.\\d\\s]+>|\\w+)");
        Matcher matcher = pattern.matcher(text);
        int count = 0;
        int end = 0;
        int totalLength = text.length();
        while(matcher.find()) {
            if (count == 0){
                //System.out.println(matcher.group(1));
                setSubject(new Text(matcher.group(1)));
                //length += getSubject().toString().length();
                //System.out.println(length);
                count +=1;
            }
            else if (count == 1){


                setPredicate(new Text(matcher.group(1)));
                count +=1;

                end = matcher.end();
            }
            else if (count == 2){
                //System.out.println(matcher.group(1));
                setObject(new Text(matcher.group(1)));
                count +=1;
                //System.out.println(text.substring(length+5, totalLength));
            }

        }
        //System.out.println(count);
        // ugly hack
        if (count == 2){
            setObject(new Text(text.substring(end+1,totalLength-2)));
        }


    }

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

不是说我觉得你的解决方案太难看了,但另一种选择是

    Pattern pattern = Pattern.compile("^(?:<([^>]+)>\s*){2}<?([^>]+)>?$");  
    Matcher matcher = pattern.matcher(text);
    if (matcher.matches()) {
       return new Triple(matcher.group(1), matcher.group(2), matcher.group(3));
    } else{
       // error handling code
    }

编辑:未编译(手头没有JRE),但语法解释了未被捕获的组?:重复2次{2}(如果需要进行一些细化);最后是选择将最后一组放在括号内还是没有。