gpt4 book ai didi

java - SPARQL 的正则表达式

转载 作者:行者123 更新时间:2023-11-29 07:37:14 25 4
gpt4 key购买 nike

我已经从 dbpedia 下载了 dbpedia_quotationsbook.zip其中包含 dbpedia_quotationsbook.nt 三元组。

在这个三元组中

subject is authorname
predicate is "sameas"
object is authorcode

我已经尝试使用 JENA 查询三重存储,正在运行简单的查询。

现在我想要所有作者名与给定字符串部分匹配的作者代码。所以我尝试了以下查询

select ?code
where
{

FILTER regex(?name, "^Rob") <http://www.w3.org/2002/07/owl#sameAs> ?code.

}

above query should return all authorcodes whose authorname contains "Rob"

我得到以下异常

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "." ". "" at line 5, column 74.
Was expecting one of:
<IRIref> ...
<PNAME_NS> ...
<PNAME_LN> ...
<BLANK_NODE_LABEL> ...
<VAR1> ...
<VAR2> ...
"true" ...
"false" ...
<INTEGER> ...
<DECIMAL> ...
<DOUBLE> ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ...
<INTEGER_NEGATIVE> ...
<DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ...
<STRING_LITERAL1> ...
<STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ...
<STRING_LITERAL_LONG2> ...
"(" ...
<NIL> ...
"[" ...
<ANON> ...

at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:34)
at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:148)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:80)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:53)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:41)
at rdfcreate.NewClass.query(NewClass.java:55)
at rdfcreate.NewClass.main(NewClass.java:97)

耶拿代码

import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.util.FileManager;

/**
*
* @author swapnil
*/
public class NewClass {
String read()
{
final String tdbDirectory = "C:\\TDBLoadGeoCoordinatesAndLabels";


String dataPath = "F:\\Swapnil Drive\\Project Stuff\\Project data 2015 16\\Freelancer\\SPARQL\\dbpedia_quotationsbook.nt";


Model tdbModel = TDBFactory.createModel(tdbDirectory);
/*Incrementally read data to the Model, once per run , RAM > 6 GB*/

FileManager.get().readModel( tdbModel, dataPath, "N-TRIPLES");

tdbModel.close();

return tdbDirectory;
}

void query(String tdbDirectory, String query1)
{


Dataset dataset = TDBFactory.createDataset(tdbDirectory);
Model tdb = dataset.getDefaultModel();
Query query = QueryFactory.create(query1);
QueryExecution qexec = QueryExecutionFactory.create(query, tdb);
/*Execute the Query*/
ResultSet results = qexec.execSelect();
System.out.println(results.getRowNumber());
while (results.hasNext()) {
// Do something important
QuerySolution qs = results.nextSolution();
qs.toString();
System.out.println("sol "+qs);
}
qexec.close();
tdb.close() ;
}

public static void main(String[] args) {

NewClass nc = new NewClass();
String tdbd= nc.read();
nc.query(tdbd, "select ?code\n" +
"WHERE\n" +
"{\n" +
"<http://dbpedia.org/resource/Robert_H._Schuller> <http://www.w3.org/2002/07/owl#sameAs> ?code.\n" +
"}");


}

}

}

结果

sol ( ?code = http://quotationsbook.com/author/6523 )

上面的查询给了我给定作者的代码。

请帮帮我

最佳答案

您不能混合模式和过滤器。您必须首先使用三重模式绑定(bind)(即选择)?name,然后过滤结果。 Jena 基本上会提示,因为您的 SPARQL 语法无效。

现在,您可以运行下面的查询,但您的数据只包含 dbpedia URI 和 quotationsbook URI 之间的映射。

PREFIX owl: <http://www.w3.org/2002/07/owl#>    
select ?code
where
{
?author <name> ?name .
?author owl:sameAs ?code .

FILTER regex(?name, "^Rob")
}

以上意思

  1. 获取作者姓名
  2. 获取作者代码
  3. 仅包括姓名与正则表达式匹配的作者
  4. 选择他们的代码

同样,这仅适用于本地可用的数据。问题是您没有实际姓名。当然,您可以将查询更改为对整个 dbpedia 标识符进行正则表达式,但这并不完美。

FILTER regex(?author, "Rob")

你能做什么,因为dbpedia资源是dereferencable , 将名称三重模式包装在 GRAPH pattern

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

select ?author ?code
where
{
GRAPH <file://path/to/dbpedia_quotationsbook.nt>
{
?author owl:sameAs ?code .
}

GRAPH ?author
{
?author <http://www.w3.org/2000/01/rdf-schema#label> ?name .
FILTER regex(?name, "^Rob")
}
}

这是发生了什么

  1. 从导入文件中获取?author?code(SPARQL GUI 导入到一个图中)
  2. ?author当作图名,这样就可以从网上下载了
  3. 获取?author?name
  4. 过滤以 Rob 开头的 ?name

根据您的 SPARQL 处理器(我使用的是 SPARQL GUI from dotNetRDF toolkit ),有两个重要的部分可以使这项工作正常进行。

这是我得到的结果的屏幕截图。请注意 dbpedia 请求的突出显示设置和 Fiddler 日志。

federated query in SPARQL GUI

底线是我刚刚给了你一个 federated SPARQL query 的例子.

关于java - SPARQL 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174585/

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