SPARQL中具有相同名称的两个/parallel/left联接的正确语法(使用可选语法)

SPARQL中具有相同名称的两个/parallel/left联接的正确语法(使用可选语法),sparql,dbpedia,Sparql,Dbpedia,我阅读了关于OPTIONAL的语法,并接着介绍了OPTIONAL。我认为我的问题归结为没有正确的语法,给定一个基集,左连接一个或另一个字段,无论哪个字段存在 据我所知,可选子句是按顺序执行的,因此我还试图利用这一点,按照我对数据字段信任的顺序,顺序填写?University变量 我的示例查询是试图找出哪些教育机构拥有最多被提名为美国小姐的校友。(我之所以选择它,是因为它很有趣,但集合相当小,足以进行调试。) 至少有两个字段似乎适合识别教育校友关系,dbpedia owl:education和db

我阅读了关于OPTIONAL的语法,并接着介绍了OPTIONAL。我认为我的问题归结为没有正确的语法,给定一个基集,左连接一个或另一个字段,无论哪个字段存在

据我所知,可选子句是按顺序执行的,因此我还试图利用这一点,按照我对数据字段信任的顺序,顺序填写?University变量

我的示例查询是试图找出哪些教育机构拥有最多被提名为美国小姐的校友。(我之所以选择它,是因为它很有趣,但集合相当小,足以进行调试。)

至少有两个字段似乎适合识别教育校友关系,
dbpedia owl:education
dbpedia2:almaMater

我的第一个查询,只是拉一下dbpedia owl:education:

SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
    ?ma dbpedia2:title :Miss_America ;
       rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
    ?ma <http://dbpedia.org/ontology/title> ?title;
       rdf:type <http://dbpedia.org/ontology/Person> .
    FILTER STRSTARTS(?title, "Miss America") .
}
    OPTIONAL {
             ?ma dbpedia-owl:education ?University 
      }
    OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
选择count(distinct(?ma))作为人,大学在哪里{
{
?硕士学位2:职称:美国小姐;
rdf:type。
}联合{
文学硕士头衔;
rdf:type。
过滤器启动(?标题,“美国小姐”)。
}
可选的{
?ma dbpedia猫头鹰:教育?大学
}
可选{ma dbpedia owl:birthDate?bday.}
}
按描述(人员)排序

我的第二个问题,就是DB2:母校:

SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
    ?ma dbpedia2:title :Miss_America ;
       rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
    ?ma <http://dbpedia.org/ontology/title> ?title;
       rdf:type <http://dbpedia.org/ontology/Person> .
    FILTER STRSTARTS(?title, "Miss America") .
}
    OPTIONAL { ?ma dbpedia2:almaMater ?University }
    OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
选择count(distinct(?ma))作为人,大学在哪里{
{
?硕士学位2:职称:美国小姐;
rdf:type。
}联合{
文学硕士头衔;
rdf:type。
过滤器启动(?标题,“美国小姐”)。
}
可选{ma dbpedia2:母校大学}
可选{ma dbpedia owl:birthDate?bday.}
}
按描述(人员)排序

正如你们所看到的,我需要问两种表达母校的方式,因为它们捕捉了不同的东西

然而,两种形式的联合(III)和联合(IV)似乎都留下了(I)或(II)中的项目。两者都没有真正给我我所寻找的上述两者的可选结合

以下是嵌套表单:

SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
    ?ma dbpedia2:title :Miss_America ;
       rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
    ?ma <http://dbpedia.org/ontology/title> ?title;
       rdf:type <http://dbpedia.org/ontology/Person> .
    FILTER STRSTARTS(?title, "Miss America") .
}
    OPTIONAL {
             ?ma dbpedia-owl:education ?University 
             OPTIONAL { ?ma dbpedia2:almaMater ?University }
      }
    OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
选择count(distinct(?ma))作为人,大学在哪里{
{
?硕士学位2:职称:美国小姐;
rdf:type。
}联合{
文学硕士头衔;
rdf:type。
过滤器启动(?标题,“美国小姐”)。
}
可选的{
?ma dbpedia猫头鹰:教育?大学
可选{ma dbpedia2:母校大学}
}
可选{ma dbpedia owl:birthDate?bday.}
}
按描述(人员)排序

这是工会表格:

SELECT count(distinct(?ma)) as ?people, ?University WHERE {
{
    ?ma dbpedia2:title :Miss_America ;
       rdf:type <http://dbpedia.org/ontology/Person> .
} UNION {
    ?ma <http://dbpedia.org/ontology/title> ?title;
       rdf:type <http://dbpedia.org/ontology/Person> .
    FILTER STRSTARTS(?title, "Miss America") .
}
    OPTIONAL {{ ?ma dbpedia-owl:education ?University } UNION
             { ?ma dbpedia2:almaMater ?University } .
      }
    OPTIONAL { ?ma dbpedia-owl:birthDate ?bday . }
}
ORDER BY DESC(?people)
选择count(distinct(?ma))作为人,大学在哪里{
{
?硕士学位2:职称:美国小姐;
rdf:type。
}联合{
文学硕士头衔;
rdf:type。
过滤器启动(?标题,“美国小姐”)。
}
可选{ma dbpedia owl:教育大学}联盟
{?ma dbpedia2:母校大学}。
}
可选{ma dbpedia owl:birthDate?bday.}
}
按描述(人员)排序

回顾一下,当我只列举名称,(I)和(II)而不进行汇总时,我得到的结果似乎不是,(III)或(IV)中的任何一个都能让我得到正确的返回集,包括(I)或(II)中存在的数据。我知道我可以单独执行查询,然后在脚本语言中合并,或者可能将这两个查询都指定为不同的可选子句变量,但这似乎很笨拙。(但如果这是推荐的方式,请告诉我。)

因此,简而言之,这个问题:

  • 我该如何表达一个查询,返回所有被提名为美国小姐的候选人,加入的题目是:母校还是教育,以存在的为准

此外,我注意到最近的美国小姐Nina Davuluri没有出现在dbpedia端点的搜索结果中,尽管她位于的搜索框中。我将如何调查wikidata和dbpedia端点之间差异的原因(以及我如何帮助反馈数据?!)

首先,如果您提供完整的SPARQL查询,包括前缀(特别是因为您使用的是一些非标准的前缀),那么提供帮助会容易得多,或者如果使用与公共端点UI相同的前缀(请参阅)。现在还不清楚什么是
dbpedia2
,等等(尽管我现在意识到
dbpedia2
是在您链接到的SNORQL资源管理器中定义的)

另外,请注意,虽然Virtuoso可能会接受您的查询,但它们实际上并不都是合法的。例如,如果您接受第一个查询并转到,您将看到变量投影语法是不合法的。这是必须的

select (count(distinct(?ma)) as ?people) ?University where
其中,
…as?people
用括号括起来,变量之间没有逗号。(这不是问题,但也可以使用
count(distinct?ma)
并保存两个括号。)

其次,由于DBpedia数据是基于Wikipedia的,这意味着它有时会有点混淆,因此最好浏览一下数据,以找到识别事物的最佳方法。在这种情况下,通过查看,确定美国小姐获奖者的一个好方法似乎是查找具有
dcterms:subject category:Miss_America_winners
的人。因此,我们有这样一个查询:

select ?person where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners
}

现在,并不是所有这些都有干净的教育/母校等信息,但您可以使用带有
|
的可选属性路径来使用任意数量的属性。然后,您将得到如下查询(针对三个属性):

这不是特别有启发性;最大的共同点是人们对这些财产没有价值。对于其他值,存在字符串和资源的混合。如果没有别的,密西西比大学就有两个。 在SPARQL中,在属性中有偏好的地方选择属性值实际上并不完全是一件小事,这一点在本文中已经讨论过
select ?education (count(distinct ?person) as ?numWinners) where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners .
  optional { 
    ?person dbpprop:education|dbpprop:almaMater|dbpedia-owl:almaMater ?education 
  }
}
group by ?education
select ?person ?education where {
  ?person a dbpedia-owl:Person ;
          dcterms:subject category:Miss_America_winners .
  optional { ?person dbpedia-owl:almaMater ?ed1 }
  optional { ?person dbpprop:almaMater ?ed2 }
  optional { ?person dbpprop:education ?ed3 }
  bind( coalesce(?ed1,?ed2,?ed3) as ?education )
}