Sparql 在jena中更改uri而不使用输入输出

Sparql 在jena中更改uri而不使用输入输出,sparql,jena,Sparql,Jena,下面是我的简单sparql查询。我想更改我的sparql查询uri,但我不知道如何在不使用输入/输出的情况下更改这个特定的东西 输入字符串: PREFIX ab: <http://learningsparql.com/ns/addressbook#> SELECT ?craigEmail WHERE { ab:craig ab:email ?craigEmail . } PREFIX ab: <http://example.com#> SELECT ?craig

下面是我的简单sparql查询。我想更改我的sparql查询uri,但我不知道如何在不使用输入/输出的情况下更改这个特定的东西

输入字符串:

PREFIX ab: <http://learningsparql.com/ns/addressbook#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }
PREFIX ab: <http://example.com#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }
前缀ab: 选择craigEmail 哪里 {ab:craig ab:email?craigEmail.} 输出字符串:

PREFIX ab: <http://learningsparql.com/ns/addressbook#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }
PREFIX ab: <http://example.com#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }
前缀ab: 选择craigEmail 哪里 {ab:craig ab:email?craigEmail.}
您能为我提供jena中这个简单的东西的代码吗…

您可以使用jena ARQ API,通过迭代SPARQL查询的三重模式元素,以编程方式替换前缀
ab
的名称空间:

import org.apache.jena.graph.Node;
导入org.apache.jena.graph.NodeFactory;
导入org.apache.jena.graph.Triple;
导入org.apache.jena.query.query;
导入org.apache.jena.query.QueryFactory;
导入org.apache.jena.sparql.core.TriplePath;
导入org.apache.jena.sparql.syntax.ElementPathBlock;
导入org.apache.jena.sparql.syntax.ElementTriplesBlock;
导入org.apache.jena.sparql.syntax.ElementVisitorBase;
导入org.apache.jena.sparql.syntax.ElementWalker;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
公开课考试{
公共静态void main(字符串[]args){
Query=QueryFactory.create(“”)+
“前缀ab:”+
“选择craigEmail,其中{ab:craig ab:email?craigEmail.}”);
//这将遍历查询的所有部分//这将遍历查询的所有部分
最后一个字符串ns=”http://example.com#";
walk(query.getQueryPattern(),new ElementVisitorBase(){//…当它是一个三元组块时。。。
公共无效访问(ElementPathBlock el){/。。。
迭代器三元组=el.patternElts();
List newTriples=new ArrayList();
while(triples.hasNext()){
TriplePath triple=triples.next();
if(triple.isTriple()){
节点s=triple.getSubject();
如果(s.isURI()){
字符串localName=s.getLocalName();
s=NodeFactory.createURI(ns+localName);
}
节点p=triple.getPredicate();
if(p.isURI()){
字符串localName=p.getLocalName();
p=NodeFactory.createURI(ns+localName);
}
节点o=triple.getSubject();
if(o.isURI()){
字符串localName=o.getLocalName();
o=NodeFactory.createURI(ns+localName);
}
newTriples.add(Triple.create(s,p,o));
}否则{
//TODO句柄三重路径
}
三元组。删除();
}
对于(三重t:新三重){
el.addTriple(t);
}
}
@凌驾
公共无效访问(ElementTripleBlock el){
迭代器三元组=el.patternElts();
List newTriples=new ArrayList();
while(triples.hasNext()){
Triple-Triple=triples.next();
节点s=triple.getSubject();
如果(s.isURI()){
字符串localName=s.getLocalName();
s=NodeFactory.createURI(ns+localName);
}
节点p=triple.getPredicate();
if(p.isURI()){
字符串localName=p.getLocalName();
p=NodeFactory.createURI(ns+localName);
}
节点o=triple.getSubject();
if(o.isURI()){
字符串localName=o.getLocalName();
o=NodeFactory.createURI(ns+localName);
}
newTriples.add(Triple.create(s,p,o));
三元组。删除();
}
对于(三重t:新三重){
el.addTriple(t);
}
}
});
query.setPrefix(“ab”,ns);
System.out.println(查询);
}
}

是否只想替换前缀为
http://learningsparql.com/ns/addressbook
带有前缀为
http://example.com#
在您的triplestore中使用SPARQL查询?@StanislavKralin我想是的,所以“简单”SPARQL更新查询和字符串破解将是一种方法。@Kalpesh:您的意思是更改RDF数据,以便为URI提供另一个名称空间。@AKSW您能提供java代码吗?您不需要java代码。好的,你可以这样做,但是你也可以写一个查询来修改数据。前缀ab:我们以前做过,它给我们以下作为输出选择?craigEmailWHERE{?craigEmail}它更改了一个基本uri,但它在三倍前替换了前缀谢谢你给我发了一个代码…但请给我你的整个java代码,因为代码给我带来了一些导入问题。你能提供导入文件吗?哦,伙计…你是怎么写Java代码的?!任何IDE都应该允许您添加导入<例如,在Eclipse中,code>Ctrl+Shift+o。我这次添加了它,下次轮到你了……很快,但它给我的输出与之前相同。。。前缀ab:选择?craigEmail WHERE{?craigEmail}