2013-03-30 42 views
2

我查询到dbpedia在其Sparql端点后,我得到的结果为Jena ResourceImpl对象。那我怎么能得到这个资源的细节?例如,如果这个资源是一个人;我怎样才能得到他/她的birthDate如何使用Jena获取Dbpedia资源详细信息?

我试过这个;但它总是返回null。

QuerySolution querySolution = resultSet.next(); 
RDFNode x = querySolution.get("x"); 
ResourceImpl resource = (ResourceImpl) x; 
Property property = new PropertyImpl("http://dbpedia.org/property/birthDate"); 
Resource propertyResourceValue = resource.getPropertyResourceValue(property); // NULL 
+0

您可以添加SPARQL查询吗? –

回答

1

假设你的SPARQL查询是SELECT ...,该ResultSet是一个表,每个QuerySolution是在表中的一行。当你从这样一排getResource,你只有一个Resource;该属性不会自动附加。因此,获得Resource上的财产价值返回null

它看起来像RDFOutput做你的预期:将SPARQL查询ResultSet转换为RDF Model

+1

'RDFOutput'在这里没有帮助,它只是将ResultSet转换为所述ResultSet的RDF编码,所以getPropertyResourceValue()将仍然不会返回任何东西 – RobV

+0

我没有使用它,但将RDFOutput .toModel()'不将属性连接到'Resource's?无论如何,我只是意识到birthDate值可能是一个文字,但是getPropertyResourceValue返回(如果我正确理解文档)由给定属性连接的资源 - 并且只有当有一个资源时。 'listProperties(Property)'或'getProperty(Property)'在这里会更有意义,不是吗? –

2

如果您想获得有关资源的更多详细信息,您可能需要进行后续的SPARQL查询。例如,

String nextQuery = "DESCRIBE " + FmtUtils.stringForNode(resource.asNode(), (SerializationContext)null); 
Query describeQuery = QueryFactory.create(nextQuery); 
QueryExecution exec = QueryExecutionFactory.sparqlService("http://endpoint", describeQuery); 
Model m = exec.execDescribe(); 

然后,您应该能够在最终模型上使用资源API来获取所需的信息。

+1

首先不会有'CONSTRUCT'查询更高效吗? –

+0

可能是的,OP没有显示他的初始查询,所以我们不知道他是否带回了大量资源或单个资源,或者他是否选择了足够的信息来使'CONSTRUCT'可行,因为您必须一定要选择你以后想要看的所有三元组 – RobV

相关问题