Sparql 数一数孩子的数量和这些孩子的孩子

Sparql 数一数孩子的数量和这些孩子的孩子,sparql,Sparql,让我们假设我有一张祖父母的名单,他们每个人都有孩子,他们每个人都有自己的孩子。就像家谱一样 假设其中一位祖父母是艾里斯·坦格利安 Aerys Targaryen有3个孩子,Rhaegar、Viserys和Daenerys 雷加有一个孩子,约翰·斯诺 维塞里斯有0个孩子 丹妮莉丝有三个孩子,卓贡、雷加尔和维塞里奥 我想制作一张表格,显示: 第1列:祖父母的姓名 第二列:祖父母的子女数量(第1列) 第三列:孩子的名字 第4列:父级拥有的子级数量(第3列) 第五列:孩子的名字 我希望得到这样的结果:

让我们假设我有一张祖父母的名单,他们每个人都有孩子,他们每个人都有自己的孩子。就像家谱一样

假设其中一位祖父母是艾里斯·坦格利安

Aerys Targaryen有3个孩子,Rhaegar、Viserys和Daenerys

雷加有一个孩子,约翰·斯诺

维塞里斯有0个孩子

丹妮莉丝有三个孩子,卓贡、雷加尔和维塞里奥

我想制作一张表格,显示:

第1列:祖父母的姓名

第二列:祖父母的子女数量(第1列)

第三列:孩子的名字

第4列:父级拥有的子级数量(第3列)

第五列:孩子的名字

我希望得到这样的结果:

+-----------------+--------+----------+--------+-----------+
|     GPName      | PCount |  PName   | CCount |   CName   |
+-----------------+--------+----------+--------+-----------+
| Aerys Targaryen |      3 | Rhaegar  |      1 | John Snow |
| Aerys Targaryen |      3 | Viserys  |      0 |           |
| Aerys Targaryen |      3 | Daenerys |      3 | Drogon    |
| Aerys Targaryen |      3 | Daenerys |      3 | Rhaegal   |
| Aerys Targaryen |      3 | Daenerys |      3 | Viserion  |
+-----------------+--------+----------+--------+-----------+
我已经设法提出了这些问题,但没有一个是我想要的

1. 我只得到前3列,而不是我想要的格式

2.
它只显示我想要的第1、3、4列。

正如前面所指出的,您需要两个单独的子查询来计算每个解决方案所需的聚合。添加了一个
可选
,以防父对象没有子对象,并在投影中使用
合并
表达式将其设置为零(如果是这种情况)

例如,符合以下查询的内容 (我已在上对照数据集进行了检查):

前缀gag:
前缀rdf:
选择?gpName?cnt?PName(合并(?cc,0)作为?cnt2?CName
哪里
{
{
选择?gp(计数(?pe1)作为?cnt){
?gp a gag:περιφρεια。
?pe1 a gag:∏εριφερειακήΕνότητα。
?pe1 gag:ανκεεισε?gp。
}分组依据?gp
}
gp gag:gpName。
?pe a gag:περιφερειακήΕνότητα。
pe-gag:ανκεε∑εgp。
pe-gag:έχειεπίσημοόνομα?PName。
可选的{
?c rdf:类型量规:Δήμος。
c gag:CName。
?c gag:ανκεειμσε?pe。
{
选择?pe(计数(?c1)作为?cc){
c1 rdf:类型量规:Δήμος。
c1 gag:ανκεεισε?pe。
}分组
}
}
}
p、 美国。 作为子查询的替代方法,您可以为子查询和子查询创建笛卡尔乘积,并计算不同的绑定,例如:

PREFIX gag: <http://geo.linkedopendata.gr/gag/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?gpName ?PName ?CName (count(distinct ?p1) as ?cnt1) (count(distinct ?c1) as ?cnt2) 
    WHERE 
    {
        ?gp a gag:Περιφέρεια .
        ?gp gag:έχει_επίσημο_όνομα ?gpName .
        ?pe gag:ανήκει_σε ?gp .
        ?pe a gag:Περιφερειακή_Ενότητα  .
        ?pe gag:έχει_επίσημο_όνομα ?PName .
        ?p1 gag:ανήκει_σε ?gp . # cartesian product with ?pe and ?p1
        ?c gag:ανήκει_σε ?pe .
        ?c gag:έχει_επίσημο_όνομα ?CName .
        ?c1 gag:ανήκει_σε ?pe . # cartesian product with ?c and ?c1

    } group by ?gpName ?PName ?CName
    order by ?gpName ?PName 
前缀gag:
前缀rdf:
选择?gpName?PName?CName(计数(不同的?p1)作为?cnt1)(计数(不同的?c1)作为?cnt2)
哪里
{
?gp a gag:περιφρεια。
gp gag:gpName。
pe-gag:ανκεε∑εgp。
?pe a gag:περιφερειακήΕνότητα。
pe-gag:έχειεπίσημοόνομα?PName。
?p1 gag:ανκεε∑ε?gp.#带?pe和?p1的笛卡尔积
?c gag:ανκεειμσε?pe。
c gag:CName。
?c1 gag:c和?c1的笛卡尔积
}分组依据?gpName?PName?CName
按?gpName?PName订购

不知道您的数据会有点困难…
前缀:选择?s?cnt?c?ccnt?cc{s a:祖父母。?s:孩子?c.可选{c:孩子?c}{select?s(count(?c)as?cnt){s a:祖父母。?s:child?c}分组依据?s}{select?c(count cc)as?ccnt{c:孩子。可选{c:孩子?cc}分组依据?c}
基于此数据:
@前缀:艾里斯·塔格利安:孩子:雷加,:维塞里斯,:丹妮莉丝;a:祖父母雷加:孩子:约翰·斯诺;a:父母,孩子:丹妮莉丝:孩子:德罗贡,:雷加尔,:维塞里奥;a:父母,孩子:维塞里是个孩子。
非常感谢你试着理解。不幸的是,这很难应用于实际数据。我认为在实际数据中没有“祖父母”关系——只有“父母”和“孩子”——因此需要一些推理a/k/a推理。这些文章可能会有帮助——,。非常感谢@Damyan Ognyanov!这就是我要找的!
SELECT ?GPName 
       (count(?PName) as ?PCount)
       ?PName
       (count(?CName) as ?CCount)
WHERE
{
      ?gp rdf:type gag:GrandParent .
      ?gp gag:name ?GPName .
      ?p rdf:type gag:Parent .
      ?p gag:name ?PName.
      ?p gag:has_parent ?gp .
      ?c rdf:type gag:Child .
      ?c gag:name ?CName.
      ?c gag:has_parent ?p.
} GROUP BY ?GPName ?PName
PREFIX gag: <http://geo.linkedopendata.gr/gag/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select ?gpName ?cnt ?PName (coalesce(?cc, 0) as ?cnt2) ?CName
WHERE 
{
    {
        select ?gp (count(?pe1) as ?cnt) {
            ?gp a gag:Περιφέρεια .
            ?pe1 a gag:Περιφερειακή_Ενότητα  .
            ?pe1 gag:ανήκει_σε ?gp .
        }group by ?gp 
    }
    ?gp gag:έχει_επίσημο_όνομα ?gpName .
    ?pe a gag:Περιφερειακή_Ενότητα  .
    ?pe gag:ανήκει_σε ?gp .
    ?pe gag:έχει_επίσημο_όνομα ?PName .
    optional {
        ?c rdf:type gag:Δήμος .
        ?c gag:έχει_επίσημο_όνομα ?CName.
        ?c gag:ανήκει_σε ?pe .
        {
            select ?pe (count(?c1) as ?cc) {
                ?c1 rdf:type gag:Δήμος .
                ?c1 gag:ανήκει_σε ?pe .
            } group by ?pe
        }
    }
}
PREFIX gag: <http://geo.linkedopendata.gr/gag/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?gpName ?PName ?CName (count(distinct ?p1) as ?cnt1) (count(distinct ?c1) as ?cnt2) 
    WHERE 
    {
        ?gp a gag:Περιφέρεια .
        ?gp gag:έχει_επίσημο_όνομα ?gpName .
        ?pe gag:ανήκει_σε ?gp .
        ?pe a gag:Περιφερειακή_Ενότητα  .
        ?pe gag:έχει_επίσημο_όνομα ?PName .
        ?p1 gag:ανήκει_σε ?gp . # cartesian product with ?pe and ?p1
        ?c gag:ανήκει_σε ?pe .
        ?c gag:έχει_επίσημο_όνομα ?CName .
        ?c1 gag:ανήκει_σε ?pe . # cartesian product with ?c and ?c1

    } group by ?gpName ?PName ?CName
    order by ?gpName ?PName