从SPARQL查询返回嵌套数据结构 [英] Return a nested data structure from a SPARQL query

查看:20
本文介绍了从SPARQL查询返回嵌套数据结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个具有这种结构的图表:

@prefix  :       <http://example/> .
@prefix  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix  foaf:   <http://xmlns.com/foaf/0.1/> .

:alice rdf:type        foaf:Person .
:alice foaf:givenName  "Alice" .
:alice foaf:familyName "Liddell" .

:bob   rdf:type        foaf:Person .
:bob   foaf:givenName  "Bob" .
:bob   foaf:familyName "Doe" .

:choi  rdf:type        foaf:Person .
:choi  foaf:givenName  "Hwa" .
:choi  foaf:familyName "Choi" .

:alice :knows          :bob, :choi .
如何以某种结构化格式获取Alice认识的人的姓名?理想的格式如下:

[
  {
    "given": "Alice",
    "family": "Liddell",
    "knows": [
      { "given": "Bob", "family": "Doe" },
      { "given": "Hwa", "family": "Choi" }
    ]
  }
]

如果我只需要单个属性的数组,我可以这样做:

SELECT ?name, (group_concat(distinct ?name;separator="|||") as ?friend_names)
WHERE {
  ?person foaf:givenName ?name,
  ?person :knows ?friend .
  ?friend foaf:givenName ?friend_name
}
GROUP BY ?name

然后,假设|||没有出现在任何名称中,则解包结果。

有没有办法获得具有多个属性(例如givenfamily)的上述响应结构,最好不使用硬编码的分隔符技巧?

推荐答案

您可以将CONSTRUCT查询与JSON-LD Framing一起使用。

查询示例(在DBpedia endpoint)

CONSTRUCT
{
  ?person  rdf:type       foaf:Person ;
           dbo:birthName  ?name1s ;
           dbo:birthDate  ?date1s ;
           dbo:spouse     ?spouse .
  ?spouse  rdf:type       foaf:Person ; 
           dbo:birthName  ?name2s ;
           dbo:birthDate  ?date2s .
}
WHERE
{
  ?person  dbo:birthName  ?name1 ;
           dbo:birthDate  ?date1 ;
           dbo:spouse     ?spouse .
  ?spouse  dbo:birthName  ?name2 ;
           dbo:birthDate  ?date2 .
  BIND (str(?name1) AS ?name1s)
  BIND (str(?date1) AS ?date1s)
  BIND (str(?name2) AS ?name2s)
  BIND (str(?date2) AS ?date2s)
  VALUES (?person) { ( dbr:Brad_Pitt ) }
}

输出(包含上下文的JSON-LD format中)

{ "@context": {
    "spouse": { "@id": "http://dbpedia.org/ontology/spouse"},
    "birthDate": { "@id": "http://dbpedia.org/ontology/birthDate" },
    "birthName": { "@id": "http://dbpedia.org/ontology/birthName" } },
  "@graph": [
    { "@id": "http://dbpedia.org/resource/Angelina_Jolie",
      "birthName": "Angelina Jolie Voight",
      "birthDate": "1975-06-04" },
    { "@id": "http://dbpedia.org/resource/Brad_Pitt",
      "@type": "http://xmlns.com/foaf/0.1/Person",
      "birthName": "William Bradley Pitt",
      "spouse": [ "http://dbpedia.org/resource/Angelina_Jolie",
                  "http://dbpedia.org/resource/Jennifer_Aniston" ],
      "birthDate": "1963-12-18" },
    { "@id": "http://dbpedia.org/resource/Jennifer_Aniston",
      "birthName": "Jennifer Joanna Aniston",
      "birthDate": "1969-02-11" }
] }

JSON-LD框架(非常简单)

{
  "@context": {"dbo": "http://dbpedia.org/ontology/",
               "dbr": "http://dbpedia.org/resource/",
               "foaf": "http://xmlns.com/foaf/0.1/"},
  "dbo:spouse": {
   }
}

框架JSON-LD(playground)

{
  "@context": {
    "dbo": "http://dbpedia.org/ontology/",
    "dbr": "http://dbpedia.org/resource/",
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@graph": [
    {
      "@id": "dbr:Brad_Pitt",
      "@type": "foaf:Person",
      "dbo:birthDate": "1963-12-18",
      "dbo:birthName": "William Bradley Pitt",
      "dbo:spouse": [
        {
          "@id": "dbr:Angelina_Jolie",
          "@type": "foaf:Person",
          "dbo:birthDate": "1975-06-04",
          "dbo:birthName": "Angelina Jolie Voight"
        },
        {
          "@id": "dbr:Jennifer_Aniston",
          "@type": "foaf:Person",
          "dbo:birthDate": "1969-02-11",
          "dbo:birthName": "Jennifer Joanna Aniston"
        }
      ]
    }
  ]
}

一些讨论

JSON-LD成帧是一个非官方但实现良好的规范,它描述了将RDF图序列化为特定JSON-LD文档布局的确定性布局。

显然,使用blank nodes property lists可以获得与所需输出结构相似的内容:

Brad_Pitt
        dbo:birthName   "William Bradley Pitt" ;
        dbo:birthDate   "1963-12-18" .
        dbo:spouse  [   dbo:birthName   "Angelina Jolie Voight" ;
                        dbo:birthDate   "1975-06-04" ] ,
                    [   dbo:birthName   "Jennifer Joanna Aniston" ;
                        dbo:birthDate   "1969-02-11" ] .

但是,这是Turtle,不是JSON,没有人能保证这些空白节点属性列表将用于序列化。

这篇关于从SPARQL查询返回嵌套数据结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆