从sparql查询返回面向对象的json

从sparql查询返回面向对象的json,json,sparql,Json,Sparql,如果我想问一些不同的属性A和B,在SPARQL中, 其中有一个唯一的A,可能每个A都有几个B 我得到的结果查询位于以下表格中: A1, B1 A1, B2 A1, B3 A1, B4 A2, B5 A1: B1,B2,B3,B4 A2: B5 我希望此查询结果的外观更符合以下形式: A1, B1 A1, B2 A1, B3 A1, B4 A2, B5 A1: B1,B2,B3,B4 A2: B5 在SPARQL中有这样做的方法吗?这被称为什么?SPARQL的JSON输出在中有文档记录,特

如果我想问一些不同的属性A和B,在SPARQL中, 其中有一个唯一的A,可能每个A都有几个B

我得到的结果查询位于以下表格中:

A1, B1
A1, B2
A1, B3
A1, B4
A2, B5
A1: B1,B2,B3,B4
A2: B5
我希望此查询结果的外观更符合以下形式:

A1, B1
A1, B2
A1, B3
A1, B4
A2, B5
A1: B1,B2,B3,B4
A2: B5

在SPARQL中有这样做的方法吗?这被称为什么?

SPARQL的JSON输出在中有文档记录,特别是第节描述了如何在JSON中编码RDF。请注意,JSON输出实际上只是用于编码SPARQL查询的结果,而不是用于创建对应于特定对象模型的JSON对象。你最好的办法可能是把你得到的结果拿出来,自己动手操作。不过,从SPARQL方面来看,仍然有一些东西可能会有所帮助

用于组合值的
组\u concat
也就是说,也许下面的内容可以帮助你得到一些对你更好的东西。如果您有这样的数据:

@前缀:。
:对象:hasA1:b1,:b2,:b3,:b4;
:hasA2:b5。
还有这样一个查询:

前缀:
选择?主题?属性?对象
在哪里{
值?属性{:hasA1:hasA2}
?主体?财产?客体。
}
您将得到如下结果:

$arq--data.n3--query.sparql
-------------------------------
|主体|财产|客体|
===============================
|:对象|:hasA1 |:b4|
|:对象|:hasA1 |:b3|
|:对象|:hasA1 |:b2|
|:对象|:hasA1 |:b1|
|:对象|:hasA2 |:b5|
-------------------------------
您可以使用
group\u concat
hasA1
的所有值组合为一个值,并执行如下查询:

前缀:
选择?主题?属性(组_concat(?object;分隔符=',')作为?cobject)
在哪里{
值?属性{:hasA1:hasA2}
?主体?财产?客体。
}
按?主体?属性分组
并得到如下结果:

$arq--data.n3--query.sparql
------------------------------------------------------------------------------------------------------------------
|主体|财产|共同主体|
==================================================================================================================
|:object |:hasA2 |”http://example.org/b5"                                                                   |
|:object |:hasA1 |”http://example.org/b4,http://example.org/b3,http://example.org/b2,http://example.org/b1" |
------------------------------------------------------------------------------------------------------------------
如果您要求JSON格式的结果,您将得到以下输出,这可能对您有用,具体取决于您的
b1
b4
是什么类型的实体。具体地说,如果它们是字符串,在这种情况下连接是有意义的,那么这就可以了。如果它们是别的东西,可能就没那么有用了

$arq-out JSON--data data.n3--query query.sparql
{
“头”:{
“VAR”:[“主体”、“财产”、“对象”]
} ,
“结果”:{
“绑定”:[
{
主题:{“类型”:“uri”,“值”:http://example.org/object" } ,
属性:{“类型”:“uri”,“值”:http://example.org/hasA2" } ,
“cobject”:{“type”:“literal”,“value”:”http://example.org/b5" }
} ,
{
主题:{“类型”:“uri”,“值”:http://example.org/object" } ,
属性:{“类型”:“uri”,“值”:http://example.org/hasA1" } ,
“cobject”:{“type”:“literal”,“value”:”http://example.org/b4,http://example.org/b3,http://example.org/b2,http://example.org/b1" }
}
]
}
}
group\u concat
构造
RDF存在JSON序列化,虽然SPARQL引擎可能不支持这些序列化,但您可以使用
构造
查询来生成一些结构更像所需表单的RDF,然后使用RDF序列化转换器转换为JSON格式。例如,Jena的
rdfcat
支持输出。使用
构造
查询,如下所示:

前缀:
构造{
?主体?财产?共同主体
}
在哪里{
选择?主题?属性(组_concat(?object;分隔符=',')作为?cobject)
在哪里{
值?属性{:hasA1:hasA2}
?主体?财产?客体。
}
按?主体?属性分组
}
(请参阅answers.semanticweb.com以了解此查询中为何存在嵌套查询的解释。)这将生成以下形式的RDF:

A1, B1
A1, B2
A1, B3
A1, B4
A2, B5
A1: B1,B2,B3,B4
A2: B5
$arq--out RDF/XML--data data.n3--query.sparql
http://example.org/b4,http://example.org/b3,http://example.org/b2,http://example.org/b1
http://example.org/b5
我们可以通过
rdfcat
来获取一些RDF/JSON,这可能最终更接近您想要的:

$arq--out-RDF/XML--data-data.n3--query-query.sparql | rdfcat-out-RDF/JSON/dev/stdin
{ 
"http://example.org/object" : { 
"http://example.org/hasA2" : [ { 
“类型”:“文字”,
“值”:http://example.org/b5"
}
] ,
"http://example.org/hasA1" : [ { 
“类型”:“文字”,
“值”:http://example.org/b4,http://example.org/b3,http://example.org/b2,http://example.org/b1"
}
]
}
}