gpt4 book ai didi

java - 如何使用 Jena 处理 DBpedia 页面的 rdf 版本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:07 25 4
gpt4 key购买 nike

在所有 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允许您传递任何(主语、谓语、宾语)模式来匹配模型中的语句。在您的情况下,如果您只关心特定谓词,那么构造函数的第一个和第三个参数为空。

允许过滤两个不同的属性

要允许更复杂的过滤,您可以实现 selects中的方法 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/Ireland是资源的 HTML 文档版本 http://dbpedia.org/resource/Ireland

为了获得 RDF,您应该解决:

http://dbpedia.org/data/Ireland.rdf

http://dbpedia.org/resource/Ireland + Accept: application/rdfxml在 HTTP header 中。与 curl它会是这样的:

curl -L -H 'Accept: application/rdf+xml' <a href="http://dbpedia.org/resource/Ireland" rel="noreferrer noopener nofollow">http://dbpedia.org/resource/Ireland</a>

关于java - 如何使用 Jena 处理 DBpedia 页面的 rdf 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4936211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com