gpt4 book ai didi

sparql - 从 SPARQL 查询返回嵌套数据结构

转载 作者:行者123 更新时间:2023-12-04 11:34:18 24 4
gpt4 key购买 nike

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

@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 Framing 是一个非官方但实现良好的规范,它描述了用于将 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 - 从 SPARQL 查询返回嵌套数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44622486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com