使用 Jena TDB 查询 Agrovoc Api
Querying Agrovoc with Jena TDB Api
我在 java 应用程序中查询 Agrovoc Agrovoc Rabbits result 时遇到问题。虽然我能够像概念一样检索有关兔子的信息。但是当我尝试检索概念标签、更广泛、更广泛的标签等属性信息时,我得到了它们的 url 而不是它们的描述。 所以我的问题是我如何获得描述或者我会说我能够检索的那些 url 的值。以及我如何查询更广泛的概念、更窄的概念,用作条目术语属性。我如何获得有关搜索查询的所有信息(如所有属性信息和描述)? 我附上了到目前为止我已经取得的成就
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.tdb.TDBFactory;
import org.apache.jena.util.FileManager;
public class TDBCreator {
public static final String THESAURUS_FILE = "C:\Users\GREEN\Desktop\wordnet\agrovoc_rdf/agrovoc_2017-05-04_core.rdf";
public static final String TDB_DIRECTORY = "C:\Users\GREEN\Desktop\wordnet\agrovoc_rdf/tdb";
public Model createTDB() {
Model model = ModelFactory.createDefaultModel();
model = TDBFactory.createDataset(TDB_DIRECTORY).getDefaultModel();
InputStream thesaurusStream = FileManager.get().open(THESAURUS_FILE);
model.read(thesaurusStream, null, "RDF/XML");
return model;
}
public static void main(String[] args) {
new TDBCreator().createTDB().close();;
}
}
此 TDBCreator 文件为我创建 TDB 文件,而 Agrovoc.java 查询
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.query.Syntax;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.sparql.algebra.Algebra;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.algebra.op.OpBGP;
import org.apache.jena.sparql.core.BasicPattern;
import org.apache.jena.sparql.core.TriplePath;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.QueryIterator;
import org.apache.jena.sparql.engine.ResultSetStream;
import org.apache.jena.sparql.path.PathFactory;
import org.apache.jena.sparql.syntax.ElementPathBlock;
import org.apache.jena.tdb.TDBFactory;
import org.apache.log4j.Logger;
public class Agrovoc {
private static Agrovoc instance;
private final Logger LOGGER = Logger.getLogger(getClass());
private Model model;
private Agrovoc() {
loadModel();
}
public static Agrovoc getInstance() {
if (instance == null) {
instance = new Agrovoc();
}
return instance;
}
private void loadModel() {
File directory = new File(TDBCreator.TDB_DIRECTORY);
if (!directory.exists()) {
directory.mkdirs();
}
model = TDBFactory.createDataset(TDBCreator.TDB_DIRECTORY).getDefaultModel();
if (model.isEmpty()) {
model = new TDBCreator().createTDB();
}
}
public void queryTerm(String label) {
ElementPathBlock pattern = new ElementPathBlock();
Var varConceptLabel = Var.alloc("conceptLabel");
Var varConcept = Var.alloc("concept");
Var varBroader = Var.alloc("broader");
Var varBroaderLabel = Var.alloc("broaderLabel");
Var varLiteralForm = Var.alloc("literalForm");
final String SKOS_URI = "http://www.w3.org/2008/05/skos-xl#";
final String SKOS_CORE_URI = "http://www.w3.org/2004/02/skos/core#";
pattern.addTriple(new Triple(varConceptLabel, NodeFactory.createURI(SKOS_URI + "literalForm"), NodeFactory.createLiteral(label, "en")));
pattern.addTriple(new Triple(varConcept, NodeFactory.createURI(SKOS_URI + "prefLabel"), varConceptLabel));
pattern.addTriplePath(new TriplePath(varConcept, PathFactory.pathZeroOrMoreN(PathFactory.pathLink(NodeFactory.createURI(SKOS_CORE_URI + "broader"))), varBroader));
pattern.addTriple(new Triple(varBroader, NodeFactory.createURI(SKOS_URI + "prefLabel"), varBroaderLabel));
pattern.addTriple(new Triple(varBroaderLabel, NodeFactory.createURI(SKOS_URI + "literalForm"), varLiteralForm));
Op op = Algebra.compile(pattern);
QueryIterator queryIterator = Algebra.exec(op, model);
List<String> resultVars = new ArrayList<String>();
resultVars.add("conceptLabel");
resultVars.add("concept");
resultVars.add("broader");
resultVars.add("broaderLabel");
resultVars.add("literalForm");
ResultSet rs = new ResultSetStream(resultVars, model, queryIterator);
while (rs.hasNext()) {
QuerySolution qs = rs.nextSolution();
Literal literal = qs.getLiteral("literalForm");
RDFNode type = qs.get("conceptLabel");
RDFNode type2 = qs.get("concept");
RDFNode type3 = qs.get("broader");
RDFNode type4 = qs.get("broaderLabel");
System.out.println(type.toString());
System.out.println(type2.toString());
System.out.println(type3.toString());
System.out.println(type4.toString());
System.out.println(literal.getString());
}
//return false;
}
}
附件是我得到的结果
我也试过运行 Sparql 查询我得到一个空结果
public void queryTerm(String term) {
//String tdb = "/usr/local/src/javadev/onld/tdb";
Dataset dataset = TDBFactory.createDataset(TDBCreator.TDB_DIRECTORY);
StringBuilder sb = new StringBuilder();
sb.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ");
sb.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> ");
sb.append("PREFIX skos: <http://www.w3.org/2004/02/skos/core#> ");
sb.append("PREFIX foaf: <http://xmlns.com/foaf/0.1/> ");
sb.append("PREFIX text: <http://jena.apache.org/text#> ");
//sb.append("SELECT * ");
//sb.append("WHERE { ?s ?p ?o } LIMIT 10 ");
//sb.append("SELECT ?label ");
//sb.append("{ ?s text:query (skos:altLabel '" + term + "' 3) ; ");
//sb.append("skos:prefLabel ?label ");
//sb.append("}");
//sb.append("SELECT ?definition ");
//sb.append("WHERE{");
//sb.append(term).append(" skos: definition ?definition.");
//sb.append("FILTER (lang(?definition) = 'en'");
//sb.append("}");
sb.append("SELECT DISTINCT ?concept ?searchLabel ");
sb.append("WHERE {");
sb.append("{ ?concept skos:prefLabel ?searchLabel. } UNION ");
sb.append("{ ?concept skos:altLabel ?searchLabel. } ");
sb.append("FILTER (regex(str(?searchLabel),
\"").append(term).append("\",").append("\"i\")) ");
sb.append("FILTER (lang(?searchLabel) = \"en\")");
sb.append("} LIMIT 10");
// sb.append("SELECT ?uri ?em { ");
// sb.append("?uri skos:prefLabel \"Japan\"@en . ");
// sb.append("OPTIONAL { <http://aims.fao.org/aos/agrovoc/c_4039>
//skos:exactMatch ?em } .");
// sb.append("}");
String queryo = "SELECT ?conceptURI ?label "
+ "\nWHERE { "
+ "\n ?conceptURI ?pred1 _:b1 . "
+ "\nFILTER( ?conceptURI = <" +
"http://aims.fao.org/aos/agrovoc/" + term + "> )"
+ "\n FILTER(?pred1 = <" + SKOSXLALTLABEL + "> || "
+ "?pred1 = <" + SKOSXLHIDDENLABEL + "> || "
+ "?pred1 = <" + SKOSXLPREFLABEL + "> ) ."
+ "\n_:b1 <" + SKOSXLLITERALFORM + "> ?label ."
+ "}";
String queryString = queryo;//sb.toString();
System.out.println (queryString);
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.create(query,
dataset.getDefaultModel());
try {
int resultSetSize = 0;
ResultSet results = qexec.execSelect();
// Output query results
ResultSetFormatter.out(System.out, results, query);
System.out.println(results.getRowNumber());
while (results.hasNext()) {
resultSetSize++;
QuerySolution solution = results.nextSolution();
Iterator varnames = solution.varNames();
System.out.println(varnames.next());
HashMap<String, String> hm = new HashMap<String, String>();
while (varnames.hasNext()) {
String name = (String) varnames.next();
RDFNode rdfnode = solution.get(name);
System.out.println("rdf node name, type: " + name);
if (rdfnode.isLiteral()) {
Literal literal = rdfnode.asLiteral();
String nodeval = literal.getString();
hm.put(name, nodeval);
System.out.println(nodeval);
} else if (rdfnode.isResource()) {
Resource resource = rdfnode.asResource();
String nodeval = resource.toString();
hm.put(name, nodeval);
System.out.println(nodeval);
}
}
}
}
finally {
qexec.close();
}
System.out.println ("Done.");
}
该查询适用于最新的 Agrovoc 数据集(核心,2017 年 7 月 3 日):
PREFIX skos-xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?concept ?conceptLabel ?broaderConcept ?broaderConceptLabel WHERE {
# set the search term
VALUES ?conceptLabel {"rabbits"@en}
# get the concept matching the term
?concept skos-xl:prefLabel ?conceptLabelNode .
?conceptLabelNode skos-xl:literalForm ?conceptLabel .
# get the broader concepts
?concept skos:broader ?broaderConcept.
# and their labels
?broaderConcept skos-xl:prefLabel ?broaderConceptLabelNode .
?broaderConceptLabelNode skos-xl:literalForm ?broaderConceptLabel .
# in English language only
FILTER(LANGMATCHES(LANG(?broaderConceptLabel), 'en'))
}
输出(我用的是Stardog三重存储)
Java @AKSW 答案代码
public void searchTerm(String term) {
StringBuilder sb = new StringBuilder();
final String SKOS_URI = "PREFIX skos-xl: <http://www.w3.org/2008/05/skos-xl#>";
final String SKOS_CORE_URI = "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>";
sb.append(SKOS_URI)
.append(SKOS_CORE_URI)
.append("SELECT ?concept ?conceptLabel ?broaderConcept ?broaderConceptLabel WHERE {")
.append("VALUES ?conceptLabel {\""+term+"\"@en}")
.append("?concept skos-xl:prefLabel ?conceptLabelNode .")
.append("?conceptLabelNode skos-xl:literalForm ?conceptLabel .")
.append("?concept skos:broader ?broaderConcept.")
.append("?broaderConcept skos-xl:prefLabel ?broaderConceptLabelNode .")
.append("?broaderConceptLabelNode skos-xl:literalForm ?broaderConceptLabel .")
.append("FILTER(LANGMATCHES(LANG(?broaderConceptLabel), 'en'))")
.append("}");
String query = sb.toString();
//System.out.println(query);
QueryExecution qexe = QueryExecutionFactory.create(query, model);
try {
ResultSet result = qexe.execSelect();
ResultSetFormatter.out(result);
} finally {
qexe.close();
}
}
我在 java 应用程序中查询 Agrovoc Agrovoc Rabbits result 时遇到问题。虽然我能够像概念一样检索有关兔子的信息。但是当我尝试检索概念标签、更广泛、更广泛的标签等属性信息时,我得到了它们的 url 而不是它们的描述。 所以我的问题是我如何获得描述或者我会说我能够检索的那些 url 的值。以及我如何查询更广泛的概念、更窄的概念,用作条目术语属性。我如何获得有关搜索查询的所有信息(如所有属性信息和描述)? 我附上了到目前为止我已经取得的成就
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.tdb.TDBFactory;
import org.apache.jena.util.FileManager;
public class TDBCreator {
public static final String THESAURUS_FILE = "C:\Users\GREEN\Desktop\wordnet\agrovoc_rdf/agrovoc_2017-05-04_core.rdf";
public static final String TDB_DIRECTORY = "C:\Users\GREEN\Desktop\wordnet\agrovoc_rdf/tdb";
public Model createTDB() {
Model model = ModelFactory.createDefaultModel();
model = TDBFactory.createDataset(TDB_DIRECTORY).getDefaultModel();
InputStream thesaurusStream = FileManager.get().open(THESAURUS_FILE);
model.read(thesaurusStream, null, "RDF/XML");
return model;
}
public static void main(String[] args) {
new TDBCreator().createTDB().close();;
}
}
此 TDBCreator 文件为我创建 TDB 文件,而 Agrovoc.java 查询
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.query.Syntax;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.sparql.algebra.Algebra;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.algebra.op.OpBGP;
import org.apache.jena.sparql.core.BasicPattern;
import org.apache.jena.sparql.core.TriplePath;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.QueryIterator;
import org.apache.jena.sparql.engine.ResultSetStream;
import org.apache.jena.sparql.path.PathFactory;
import org.apache.jena.sparql.syntax.ElementPathBlock;
import org.apache.jena.tdb.TDBFactory;
import org.apache.log4j.Logger;
public class Agrovoc {
private static Agrovoc instance;
private final Logger LOGGER = Logger.getLogger(getClass());
private Model model;
private Agrovoc() {
loadModel();
}
public static Agrovoc getInstance() {
if (instance == null) {
instance = new Agrovoc();
}
return instance;
}
private void loadModel() {
File directory = new File(TDBCreator.TDB_DIRECTORY);
if (!directory.exists()) {
directory.mkdirs();
}
model = TDBFactory.createDataset(TDBCreator.TDB_DIRECTORY).getDefaultModel();
if (model.isEmpty()) {
model = new TDBCreator().createTDB();
}
}
public void queryTerm(String label) {
ElementPathBlock pattern = new ElementPathBlock();
Var varConceptLabel = Var.alloc("conceptLabel");
Var varConcept = Var.alloc("concept");
Var varBroader = Var.alloc("broader");
Var varBroaderLabel = Var.alloc("broaderLabel");
Var varLiteralForm = Var.alloc("literalForm");
final String SKOS_URI = "http://www.w3.org/2008/05/skos-xl#";
final String SKOS_CORE_URI = "http://www.w3.org/2004/02/skos/core#";
pattern.addTriple(new Triple(varConceptLabel, NodeFactory.createURI(SKOS_URI + "literalForm"), NodeFactory.createLiteral(label, "en")));
pattern.addTriple(new Triple(varConcept, NodeFactory.createURI(SKOS_URI + "prefLabel"), varConceptLabel));
pattern.addTriplePath(new TriplePath(varConcept, PathFactory.pathZeroOrMoreN(PathFactory.pathLink(NodeFactory.createURI(SKOS_CORE_URI + "broader"))), varBroader));
pattern.addTriple(new Triple(varBroader, NodeFactory.createURI(SKOS_URI + "prefLabel"), varBroaderLabel));
pattern.addTriple(new Triple(varBroaderLabel, NodeFactory.createURI(SKOS_URI + "literalForm"), varLiteralForm));
Op op = Algebra.compile(pattern);
QueryIterator queryIterator = Algebra.exec(op, model);
List<String> resultVars = new ArrayList<String>();
resultVars.add("conceptLabel");
resultVars.add("concept");
resultVars.add("broader");
resultVars.add("broaderLabel");
resultVars.add("literalForm");
ResultSet rs = new ResultSetStream(resultVars, model, queryIterator);
while (rs.hasNext()) {
QuerySolution qs = rs.nextSolution();
Literal literal = qs.getLiteral("literalForm");
RDFNode type = qs.get("conceptLabel");
RDFNode type2 = qs.get("concept");
RDFNode type3 = qs.get("broader");
RDFNode type4 = qs.get("broaderLabel");
System.out.println(type.toString());
System.out.println(type2.toString());
System.out.println(type3.toString());
System.out.println(type4.toString());
System.out.println(literal.getString());
}
//return false;
}
}
附件是我得到的结果
我也试过运行 Sparql 查询我得到一个空结果
public void queryTerm(String term) {
//String tdb = "/usr/local/src/javadev/onld/tdb";
Dataset dataset = TDBFactory.createDataset(TDBCreator.TDB_DIRECTORY);
StringBuilder sb = new StringBuilder();
sb.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ");
sb.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> ");
sb.append("PREFIX skos: <http://www.w3.org/2004/02/skos/core#> ");
sb.append("PREFIX foaf: <http://xmlns.com/foaf/0.1/> ");
sb.append("PREFIX text: <http://jena.apache.org/text#> ");
//sb.append("SELECT * ");
//sb.append("WHERE { ?s ?p ?o } LIMIT 10 ");
//sb.append("SELECT ?label ");
//sb.append("{ ?s text:query (skos:altLabel '" + term + "' 3) ; ");
//sb.append("skos:prefLabel ?label ");
//sb.append("}");
//sb.append("SELECT ?definition ");
//sb.append("WHERE{");
//sb.append(term).append(" skos: definition ?definition.");
//sb.append("FILTER (lang(?definition) = 'en'");
//sb.append("}");
sb.append("SELECT DISTINCT ?concept ?searchLabel ");
sb.append("WHERE {");
sb.append("{ ?concept skos:prefLabel ?searchLabel. } UNION ");
sb.append("{ ?concept skos:altLabel ?searchLabel. } ");
sb.append("FILTER (regex(str(?searchLabel),
\"").append(term).append("\",").append("\"i\")) ");
sb.append("FILTER (lang(?searchLabel) = \"en\")");
sb.append("} LIMIT 10");
// sb.append("SELECT ?uri ?em { ");
// sb.append("?uri skos:prefLabel \"Japan\"@en . ");
// sb.append("OPTIONAL { <http://aims.fao.org/aos/agrovoc/c_4039>
//skos:exactMatch ?em } .");
// sb.append("}");
String queryo = "SELECT ?conceptURI ?label "
+ "\nWHERE { "
+ "\n ?conceptURI ?pred1 _:b1 . "
+ "\nFILTER( ?conceptURI = <" +
"http://aims.fao.org/aos/agrovoc/" + term + "> )"
+ "\n FILTER(?pred1 = <" + SKOSXLALTLABEL + "> || "
+ "?pred1 = <" + SKOSXLHIDDENLABEL + "> || "
+ "?pred1 = <" + SKOSXLPREFLABEL + "> ) ."
+ "\n_:b1 <" + SKOSXLLITERALFORM + "> ?label ."
+ "}";
String queryString = queryo;//sb.toString();
System.out.println (queryString);
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.create(query,
dataset.getDefaultModel());
try {
int resultSetSize = 0;
ResultSet results = qexec.execSelect();
// Output query results
ResultSetFormatter.out(System.out, results, query);
System.out.println(results.getRowNumber());
while (results.hasNext()) {
resultSetSize++;
QuerySolution solution = results.nextSolution();
Iterator varnames = solution.varNames();
System.out.println(varnames.next());
HashMap<String, String> hm = new HashMap<String, String>();
while (varnames.hasNext()) {
String name = (String) varnames.next();
RDFNode rdfnode = solution.get(name);
System.out.println("rdf node name, type: " + name);
if (rdfnode.isLiteral()) {
Literal literal = rdfnode.asLiteral();
String nodeval = literal.getString();
hm.put(name, nodeval);
System.out.println(nodeval);
} else if (rdfnode.isResource()) {
Resource resource = rdfnode.asResource();
String nodeval = resource.toString();
hm.put(name, nodeval);
System.out.println(nodeval);
}
}
}
}
finally {
qexec.close();
}
System.out.println ("Done.");
}
该查询适用于最新的 Agrovoc 数据集(核心,2017 年 7 月 3 日):
PREFIX skos-xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?concept ?conceptLabel ?broaderConcept ?broaderConceptLabel WHERE {
# set the search term
VALUES ?conceptLabel {"rabbits"@en}
# get the concept matching the term
?concept skos-xl:prefLabel ?conceptLabelNode .
?conceptLabelNode skos-xl:literalForm ?conceptLabel .
# get the broader concepts
?concept skos:broader ?broaderConcept.
# and their labels
?broaderConcept skos-xl:prefLabel ?broaderConceptLabelNode .
?broaderConceptLabelNode skos-xl:literalForm ?broaderConceptLabel .
# in English language only
FILTER(LANGMATCHES(LANG(?broaderConceptLabel), 'en'))
}
输出(我用的是Stardog三重存储)
Java @AKSW 答案代码
public void searchTerm(String term) {
StringBuilder sb = new StringBuilder();
final String SKOS_URI = "PREFIX skos-xl: <http://www.w3.org/2008/05/skos-xl#>";
final String SKOS_CORE_URI = "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>";
sb.append(SKOS_URI)
.append(SKOS_CORE_URI)
.append("SELECT ?concept ?conceptLabel ?broaderConcept ?broaderConceptLabel WHERE {")
.append("VALUES ?conceptLabel {\""+term+"\"@en}")
.append("?concept skos-xl:prefLabel ?conceptLabelNode .")
.append("?conceptLabelNode skos-xl:literalForm ?conceptLabel .")
.append("?concept skos:broader ?broaderConcept.")
.append("?broaderConcept skos-xl:prefLabel ?broaderConceptLabelNode .")
.append("?broaderConceptLabelNode skos-xl:literalForm ?broaderConceptLabel .")
.append("FILTER(LANGMATCHES(LANG(?broaderConceptLabel), 'en'))")
.append("}");
String query = sb.toString();
//System.out.println(query);
QueryExecution qexe = QueryExecutionFactory.create(query, model);
try {
ResultSet result = qexe.execSelect();
ResultSetFormatter.out(result);
} finally {
qexe.close();
}
}