java-如何使用耶拿处理DBpedia页面的rdf版本?
作者:互联网
在所有dbpedia页面中,例如
http://dbpedia.org/page/Ireland
有指向RDF文件的链接.
在我的应用程序中,我需要分析rdf代码并对其运行一些逻辑.
我可以依赖dbpedia SPARQL端点,但是我更喜欢在本地下载rdf代码并对其进行解析,以完全控制它.
我安装了JENA,然后尝试解析代码并提取例如名为“ geo:geometry”的属性.
我正在尝试:
StringReader sr = new StringReader( node.rdfCode )
Model model = ModelFactory.createDefaultModel()
model.read( sr, null )
如何查询模型以获取所需信息?
例如,如果我想获得该语句:
<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland">
<geo:geometry xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" rdf:datatype="http://www.openlinksw.com/schemas/virtrdf#Geometry">POINT(-7 53)</geo:geometry>
</rdf:Description>
要么
<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland">
<dbpprop:countryLargestCity xmlns:dbpprop="http://dbpedia.org/property/" xml:lang="en">Dublin</dbpprop:countryLargestCity>
</rdf:Description>
什么是正确的过滤器?
非常感谢!
木兰
解决方法:
在Jena模型中解析了文件后,您可以使用以下方法进行迭代和过滤:
//Property to filter the model
Property geoProperty =
model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#",
"geometry");
//Iterator based on a Simple selector
StmtIterator iter =
model.listStatements(new SimpleSelector(null, geoProperty, (RDFNode)null));
//Loop to traverse the statements that match the SimpleSelector
while (iter.hasNext()) {
Statement stmt = iter.nextStatement();
System.out.print(stmt.getSubject().toString());
System.out.print(stmt.getPredicate().toString());
System.out.println(stmt.getObject().toString());
}
SimpleSelector允许您传递任何(主题,谓词,对象)模式以匹配模型中的语句.就您而言,如果您只关心特定的谓词,则构造函数的第一个和第三个参数为空.
允许过滤两个不同的属性
要允许进行更复杂的过滤,您可以在
SimpleSelector界面如下:
Property geoProperty = /* like before */;
Property countryLargestCityProperty =
model. createProperty("http://dbpedia.org/property/",
"countryLargestCity");
SimpleSelector selector = new SimpleSelector(null, null, (RDFNode)null) {
public boolean selects(Statement s)
{ return s.getPredicate().equals(geoProperty) ||
s.getPredicate().equals(countryLargestCityProperty) ;}
}
StmtIterator iter = model.listStatements(selector);
while(it.hasNext()) {
/* same as in the previous example */
}
编辑:包括一个完整的例子
此代码包含一个适用于我的完整示例.
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.SimpleSelector;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.rdf.model.Statement;
public class TestJena {
public static void main(String[] args) {
FileManager fManager = FileManager.get();
fManager.addLocatorURL();
Model model = fManager.loadModel("http://dbpedia.org/data/Ireland.rdf");
Property geoProperty =
model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#",
"geometry");
StmtIterator iter =
model.listStatements(new SimpleSelector(null, geoProperty,(RDFNode) null));
//Loop to traverse the statements that match the SimpleSelector
while (iter.hasNext()) {
Statement stmt = iter.nextStatement();
if (stmt.getObject().isLiteral()) {
Literal obj = (Literal) stmt.getObject();
System.out.println("The geometry predicate value is " +
obj.getString());
}
}
}
}
完整的示例将输出:
The geometry predicate value is POINT(-7 53)
有关链接数据的注意事项
http://dbpedia.org/page/爱尔兰是资源http://dbpedia.org/resource/Ireland的HTML文档版本
为了获得RDF,您应该解决:
http://dbpedia.org/data/Ireland.rdf
要么
http://dbpedia.org/resource/Ireland接受:HTTP标头中的application / rdfxml.
使用curl会像:
curl -L -H’接受:应用程序/ rdf xml’http://dbpedia.org/resource/Ireland
标签:jena,dbpedia,rdf,java,parsing 来源: https://codeday.me/bug/20191023/1913656.html