2013-12-12 39 views
3

我有一个入门级的问题,我的书无法提供帮助,我也困惑了一位同事。我可以在不指定前缀的情况下使用RDF,以及如何在SPARQL查询中指定谓词?SPARQL中没有前缀的查询

我这样做是R中的RRDF包,但如果我设置了专卖店作为

A=new.rdf(ontology=F) 
add.triple(A,"Ian","sonOf","Daddy") 
add.triple(A,"Ian","sonOf","Mummy") 
add.triple(A,"Ian","likes","Chocolate") 

我得到以下信息

## Error: com.hp.hpl.jena.query.QueryParseException: Lexical error 
at line 1, column 40. Encountered: " " (32), after : "sonOf" 

到查询

sparql.rdf(A, "select ?son ?parent where {?son sonOf ?parent}") 

我能以这种方式使用sonOf吗?我是否必须先设置我自己的Schema?我在做一些根本性错误?如果我的所有数据都驻留在同一个数据源上,我必须使用前缀吗?

回答

1

rrdf [R包,下面的语法似乎工作:

library(rrdf) 
D = new.rdf(ontology = F) 
add.triple(D, "ian", "w:likes", "food") 
add.triple(D, "ian", "w:hates", "homework") 
sparql.rdf(D, "select ?child ?object where {?child <w:likes> ?object.}") 
sparql.rdf(D, "select ?child ?object where {?child <w:hates> ?object.}") 

因此,你需要在SPARQL呼叫<>而不是调用用于add.triple()。这现在看起来很明显,但当时我们中有一些人感到困惑。

4

RDF谓词总是一个URI(从技术上讲,实际上是一个IRI,但是让我们把它放在一边)。

它可以被指定为前缀的名字:

namespace:sonOf 

或IRIRef,如:

<http://my.namespace.com#sonOf> 

,但我不认为它可以作为一个简单的标签,像你尝试。

如果使用前缀名称样式,则必须定义前缀并将其绑定到名称空间,以便可以从输入中构建有效的URI。

(正式语法在SPARQL Specification给出。)

+0

这真的很有用。如果我尝试这样做,它仍然不起作用。我是否必须在我指定的URI处定义任何内容?即在你的例子中,是my.namespace.com实际使用? – drw

+1

那么这个URI必须实际存在于你的数据中,我不熟悉你使用的软件包,所以我不知道它是如何创建URIs,如你的问题所示。它可能会保持相对URI,在这种情况下,您应该能够直接使用'',如果这样做不起作用,请尝试将数据转储到NTriples,因为这需要它将URI全写出 – RobV

+0

是否存在一种告诉仓库中所有'名称空间'可用的方法?或者有没有办法告诉一个三元组与哪个命名空间相关联?请参阅[我最近的问题](http://stackoverflow.com/questions/40854135/how-to-list-all-all-namespaces-in-virtuoso) – amphibient

0

我想你问的“空白”的前缀......如果是这样:

当你定义你的前缀,你可以说是这样的:

PREFIX : <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

其将被使用,如:

?sub :sonOf ?obj