以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  sparql查询RDF文档,如何得到查询到的资源的URI?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=74752)


--  作者:senvenstars
--  发布时间:5/9/2009 6:47:00 PM

--  sparql查询RDF文档,如何得到查询到的资源的URI?
我用sparql api在eclipse中查询、输出都成功,但是在查询资源主体时输出的却是一个空节点。查询的rdf文档内容如下:
<?xml version='1.0' encoding='UTF-8'?>

<rdf:RDF
  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  xmlns:vCard='http://www.w3.org/2001/vcard-rdf/3.0#'>
  <rdf:Description rdf:about="http://somewhere/JohnSmith/">
    <vCard:FN>John Smith</vCard:FN>
    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Smith</vCard:Family>
    <vCard:Given>John</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/RebeccaSmith/">
    <vCard:FN>Becky Smith</vCard:FN>
    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Smith</vCard:Family>
    <vCard:Given>Rebecca</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/SarahJones/">
    <vCard:FN>Sarah Jones</vCard:FN>
    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Jones</vCard:Family>
    <vCard:Given>Sarah</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/MattJones/">
    <vCard:FN>Matt Jones</vCard:FN>
    <vCard:N vCard:Family="Jones" vCard:Given="Matthew"/>
  </rdf:Description>

</rdf:RDF>
查询的语句为:
String queryStr=
"PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>"+
"select ?resource ?p "+"where { "+"?resource ?p \"Smith\" "+" }";
输出的结果却为:
( ?res = _:b0 ) ( ?p = <http://www.w3.org/2001/vcard-rdf/3.0#Family> )
( ?res = _:b1 ) ( ?p = <http://www.w3.org/2001/vcard-rdf/3.0#Family> )
请问:我如何得到resource的链接呢?应该是这两条链接:
http://somewhere/JohnSmith/
http://somewhere/RebeccaSmith/


--  作者:Roger_
--  发布时间:5/9/2009 8:05:00 PM

--  
只看第一个人
  <rdf:Description rdf:about="http://somewhere/JohnSmith/">
    <vCard:FN>John Smith</vCard:FN>
    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Smith</vCard:Family>
    <vCard:Given>John</vCard:Given>
    </vCard:N>
  </rdf:Description>

  按照你给的SPARQL语句查到的应该是这个<vCard:N rdf:parseType="Resource">

如果想得到url的话
可以这么改(只写SPARQL)
....
SELECT ?url
WHERE{
?resource vCard:FN "Smith".
?url vCard:N ?resource.}


--  作者:senvenstars
--  发布时间:5/9/2009 8:30:00 PM

--  
谢谢回复!按你的方法得到uri了。
不过按我贴的代码运行还是和我贴出的结果一样,和你说的输出结果不一样,不知是什么原因
在此感谢!
另外,如果我想在java中操作这结果集,该如何操作?比如这次的搜索的输出语句为:ResultSetFormatter.out(System.out,results,query);那么结果的形式则是:
------------------------------------
| url                              |
====================================
| <http://somewhere/RebeccaSmith/> |
| <http://somewhere/JohnSmith/>    |
------------------------------------
如果用System.out.println(res.next());语句输出,则是
( ?url = <http://somewhere/RebeccaSmith/> )
( ?url = <http://somewhere/JohnSmith/> )
有没有方法,把结果集转成可操作的?
如果我定义一个Resource,如果把结果中的数据赋值给Resource?
--  作者:senvenstars
--  发布时间:5/9/2009 8:44:00 PM

--  
还有一个问题。结果的输出是源于这句话的存在<vCard:N rdf:parseType="Resource">如果没有这几句话,又如何得到uri呢,假设数据集为
<rdf:Description rdf:about="http://somewhere/SarahJones/">
    <vCard:FN>Sarah</vCard:FN>
</rdf:Description>
那么又如何呢?
呵呵,对你这句 ?url vCard:N ?resource. 很好奇,是如何写出的?我刚接触sparql时间不久,对它的语法了解的还不够
--  作者:Roger_
--  发布时间:5/10/2009 9:38:00 PM

--  
以下是引用senvenstars在2009-5-9 20:44:00的发言:
还有一个问题。结果的输出是源于这句话的存在<vCard:N rdf:parseType="Resource">如果没有这几句话,又如何得到uri呢,假设数据集为
<rdf:Description rdf:about="http://somewhere/SarahJones/">
     <vCard:FN>Sarah</vCard:FN>
</rdf:Description>
那么又如何呢?
呵呵,对你这句 ?url vCard:N ?resource. 很好奇,是如何写出的?我刚接触sparql时间不久,对它的语法了解的还不够


我觉得应该先把所给的rdf图的关系搞清楚,一共出现了几个三元组以及三元组间的关系 (比如公共subject或者object)

sparql查询机制在于sparql三元组模式(如上面的 ?resource vCard:Family "Smith")与RDF statement三元组间的匹配,通过三元组模式 ?resource vCard:Family "Smith" 将得到vCard:Family为Smith的resource(注意这里得到的resource并不是"http://somewhere/JohnSmith/",而是"http://somewhere/JohnSmith/"  vCard:N resource这个三元组的宾语),紧接着的三元组模式 ?url vCard:N ?resource利用得到的?resource查询符合的新的resource(即"http://somewhere/JohnSmith/")

至于 <rdf:Description rdf:about="http://somewhere/SarahJones/">
     <vCard:FN>Sarah</vCard:FN>
</rdf:Description>
查询很简单
...
where{
?url vCard:FN "Sarah".}


--  作者:Roger_
--  发布时间:5/10/2009 9:47:00 PM

--  
以下是引用senvenstars在2009-5-9 20:30:00的发言:
谢谢回复!按你的方法得到uri了。
不过按我贴的代码运行还是和我贴出的结果一样,和你说的输出结果不一样,不知是什么原因



说一下你的代码为什么得不到所需要的url
select ?resource ?p
where { ?resource ?p "Smith".}
这条sparql查询的是RDF里面以Smith作为宾语的三元组的主语和谓语
    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Smith</vCard:Family>

    <vCard:N rdf:parseType="Resource">
    <vCard:Family>Smith</vCard:Family>
这两个三元组的主语在RDF图里实际上是一个空的节点(BLANK NODE),所以自动标记为
?res = _:b0 ?res = _:b1
  
"
另外,如果我想在java中操作这结果集,该如何操作?比如这次的搜索的输出语句为:ResultSetFormatter.out(System.out,results,query);那么结果的形式则是:
------------------------------------
| url                              |
====================================
| <http://somewhere/RebeccaSmith/> |
| <http://somewhere/JohnSmith/>    |
------------------------------------
如果用System.out.println(res.next());语句输出,则是
( ?url = <http://somewhere/RebeccaSmith/> )
( ?url = <http://somewhere/JohnSmith/> )
有没有方法,把结果集转成可操作的?
如果我定义一个Resource,如果把结果中的数据赋值给Resource?"

结果保存在ResultSet里,当然是可操作的吧
Resource r=(Resource)res.next()


--  作者:Roger_
--  发布时间:5/10/2009 9:54:00 PM

--  
[url]http://www.w3.org/TR/rdf-sparql-query/[/url]
w3c给的sparql的英文说明文档
当然你可以GOOGLE查询中文的sparq说明文档
--  作者:lghlrjzhx
--  发布时间:10/9/2009 11:13:00 PM

--  
请教楼主,如何用sparql api在eclipse中查询的,我正在学习SPARQL,只能够在命令行里进行,苦苦寻求在eclipse里运行sparql。请问楼主你的这些查询语句在eclipse的那个目录下输入的?是新建的文件里输入吗?
--  作者:Roger_
--  发布时间:10/10/2009 9:28:00 AM

--  
我记得 jena 提供了两种方法输入SPARQL语句
可以在代码里写,也可以先放到文件里,然后导入
--  作者:lghlrjzhx
--  发布时间:10/10/2009 11:24:00 PM

--  
9楼的 Roger_ 大哥,请你详细指点一下吧,你说 “在代码里写”,是在 Arq examples 目录下选一个来更改代码,还是新建一个类 包为Arq.examples ,然后在里面输入代码吗?
2 也可以先放到文件里,然后导入;先放在.rq 文件里吗?导入是导 “常规”下的“文件系统”吗

好想加你为QQ好友,多多交流 我的QQ 309343681 我在四川大学学习


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms