我有一个问题
CONSTRUCT { ?highValForeignTran ?hvFTPred ?hvFTObj . }
WHERE { ?highValForeignTran vocab:accounttransactions_transactionCurrency "USD" .
?highValForeignTran vocab:accounttransactions_transactionValue ?tranValue .
?highValForeignTran vocab:accounttransactions_transactionDate ?tranDate .
?highValForeignTran ?hvFTPred ?hvFTObj .
FILTER ( ?tranValue > 10000) .
FILTER ( ?tranDate >= "2013-11-23"^^xsd:date && ?tranDate <= "2013-11-23"^^xsd:date) .
}
返回结果的函数:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:vocab="http://localhost:2020/resource/vocab/"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:db="http://localhost:2020/resource/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:map="http://localhost:2020/resource/#">
<vocab:accounttransactions rdf:about="http://localhost:2020/resource/accounttransactions/1">
<vocab:accounttransactions_id rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>1</vocab:accounttransactions_id>
<vocab:accounttransactions_transactionCurrency>USD</vocab:accounttransactions_transactionCurrency>
<vocab:accounttransactions_originAccountNumber>DB48939239</vocab:accounttransactions_originAccountNumber>
<vocab:accounttransactions_transactionType>Cr</vocab:accounttransactions_transactionType>
<vocab:accounttransactions_transactionDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date"
>2013-11-23</vocab:accounttransactions_transactionDate>
<vocab:accounttransactions_destinationAccountId rdf:resource="http://localhost:2020/resource/bankaccounts/1"/>
<vocab:accounttransactions_transactionValue rdf:datatype=
"http://www.w3.org/2001/XMLSchema#decimal">12000</vocab:accounttransactions_transactionValue>
<rdfs:label>accounttransactions #1</rdfs:label>
<vocab:accounttransactions_destinationAccountNumber>47321896544567</vocab:accounttransactions_destinationAccountNumber>
</vocab:accounttransactions>
</rdf:RDF>
当我尝试使用Jena解析它时,我只得到一个表示外部accountTransactions三元组的三元组。
{"http://localhost:2020/resource/accounttransactions/1":
{"subject":"http://localhost:2020/resource/accounttransactions/1",
"predicate":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
"object":"http://localhost:2020/resource/vocab/accounttransactions"}
}
我不知道为什么其他的三元组会嵌套在里面,但我真的需要能够解析它们并将它们发送为JSON。以下是我的代码:
try {
Model result = qexec.execConstruct();
JSONObject jsonShell = new JSONObject();
StmtIterator stmtIter = model.listStatements();
while ( stmtIter.hasNext() ) {
Statement stmt = stmtIter.nextStatement();
JSONObject innerJson = new JSONObject();
innerJson.put("subject", stmt.getSubject().visitWith(rdfVisitor));
innerJson.put("predicate", stmt.getPredicate().visitWith(rdfVisitor));
innerJson.put("object", stmt.getObject().visitWith(rdfVisitor));
jsonShell.put(String.valueOf(stmt.getSubject().visitWith(rdfVisitor)), innerJson);
}
System.out.println(resultJson.toString());
}
finally {
qexec.close();
}
RDFVisitor rdfVisitor = new RDFVisitor() {
@Override
public Object visitURI(Resource r, String uri) {
return uri;
}
@Override
public Object visitLiteral(Literal l) {
return l.getLexicalForm();
}
@Override
public Object visitBlank(Resource r, AnonId id) {
return id.getLabelString();
}
};
我想知道 Statement.getProperty()
是否能解决问题,但是找不到创建 Property
实例的方法。
jsonShell.put("X", innerJson)
的话,它会把很多"X"元素添加到JSON里面吗?还是只会覆盖之前的一个?如果你在这个模型中所有的三元组都有相同的主语,那么如果你执行jsonShell.put(<subject-uri>,innerJson)
并且覆盖了一个已存在的条目,你最终只会得到一个。 - Joshua Taylor