Java SPARQL的正则表达式

Java SPARQL的正则表达式,java,rdf,sparql,apache-jena,Java,Rdf,Sparql,Apache Jena,我已经下载了dbpedia“u quotationsbook.zip,其中包含dbpedia”u quotationsbook.nt三重存储 在这个三重洞里 主题为authorname 谓词是“sameas” 对象是authorcode 我用JENA尝试了这个查询triplestore,简单的查询正在运行 现在我想要所有authorname与给定字符串部分匹配的authorcode。 所以我尝试了以下查询 select ?code where { FILTER regex(?name, "^R

我已经下载了dbpedia“u quotationsbook.zip,其中包含dbpedia”u quotationsbook.nt三重存储

在这个三重洞里

主题为authorname
谓词是“sameas”
对象是authorcode

我用JENA尝试了这个查询triplestore,简单的查询正在运行

现在我想要所有authorname与给定字符串部分匹配的authorcode。 所以我尝试了以下查询

select ?code
where
{

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

}
select?代码
哪里
{
过滤正则表达式(?name,“^Rob”)代码。
}
上述查询应返回authorname包含的所有authorcodes “罗布”

我得到了以下例外

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)
线程“main”com.hp.hpl.jena.query.QueryParseException:遇到异常。“”在第5行第74列。 我期待的是: ... ... ... ... ... ... “真的”。。。 “假”。。。 ... ... ... ... ... ... ... ... ... ... ... ... ... "(" ... ... "[" ... )

上面的查询为我提供了给定作者的代码


请在这方面帮助我

您不能混合模式和过滤器。您必须首先使用三重模式绑定(即选择)
?名称
,然后过滤结果。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")
}
因为dbpedia资源是,所以您可以做的是将名称三元组模式包装在

前缀owl:
前缀foaf:
选择?作者?代码
哪里
{
图表
{
?作者owl:sameAs?代码。
}
图表作者
{
作者姓名。
筛选器正则表达式(?名称“^Rob”)
}
}
下面是发生的事情

  • 从导入文件中获取作者和代码(SPARQL GUI导入到图形中)
  • ?author
    视为图形名称,以便从web上下载
  • 获取作者的姓名
  • 过滤器
    ?名称
    s,以Rob开头
  • 根据您的SPARQL处理器(我正在使用),有两个重要的方面可以实现这一点

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


    底线是我刚刚给了你一个例子。

    你不能混合模式和过滤器。你必须首先使用三重模式绑定(即选择)
    ?名称,然后过滤结果。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")
    }
    
    因为dbpedia资源是,所以您可以做的是将名称三元组模式包装在

    前缀owl:
    前缀foaf:
    选择?作者?代码
    哪里
    {
    图表
    {
    ?作者owl:sameAs?代码。
    }
    图表作者
    {
    作者姓名。
    筛选器正则表达式(?名称“^Rob”)
    }
    }
    
    下面是发生的事情

  • 从导入文件中获取作者和代码(SPARQL GUI导入到图形中)
  • ?author
    视为图形名称,以便从web上下载
  • 获取作者的姓名
  • 过滤器
    ?名称
    s,以Rob开头
  • 根据您的SPARQL处理器(我正在使用),有两个重要的方面可以实现这一点

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


    底线是我刚刚给了你一个例子。

    另外,
    sameAs
    不用于查询比较,而是用于断言两个资源是相同的。你的意图是前者吗?我在上面的查询中引用了2.1节。由于我没有将sameAs用于查询比较目的,
    sameAs
    也不用于查询比较,但要断言两个资源是相同的。您在这里的意图是前者吗?我参考了2.1节来编写上述查询。为了进行查询比较,我没有使用相同的查询。我通过更改和
    相应的IRI来检查上述查询,但没有结果,即QuerySolution.hasNext为false。您尝试过qu吗dbpedia_quotationsbook.nt上的erying?很抱歉,我在写上述内容时无法深入实际数据。似乎我做了错误的假设。我将更新我的问题,尽管它变得更复杂一些。Bugger,我的SPARQL GUI似乎有一些问题,因为我没有从
    图形作者
    中获得任何匹配项>模式。请写下Jena是如何为您工作的。对不起,我恐怕无法进一步帮助您。我从未使用过Jena。您应该探索使用Jena执行联邦查询,我上面的示例应该会对您有所帮助。我通过更改和
    各自的IRI检查了上述查询,但没有结果,即QuerySolution.hasNext是false.你试过在dbpedia_quotationsbook.nt上查询吗?很抱歉,我在写上述内容时无法深入实际数据。似乎我做了错误的假设。我将更新我的问题,尽管它有点复杂,但我的SPARQL GUI似乎有一些问题,因为我没有从<代码中获得任何匹配项>GRAPH?作者
    模式。请写下Jena是如何为您工作的。对不起,我恐怕无法进一步帮助您。我从未使用过Jena。您应该探索使用Jena执行联合查询,我上面的示例应该对您有所帮助。
    FILTER regex(?author, "Rob")
    
    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")
       }
    }