在 DBpedia 中使用 SPARQL 查找连接实体的主题
find the subjects that are connecting entites in DBpedia with SPARQL
我从文本中提取实体,大多数时候我会得到多个实体,例如 <http://dbpedia.org/resource/NASA>
、<http://dbpedia.org/resource/IPhone>
和 <http://dbpedia.org/resource/Apple_Inc.>
这两个实体,不共享 dct:subject
有没有办法查询路径以获取连接我的实体的主题列表?
我的目标是创建一种 "page rank",为给定实体找到最相关的主题。
最好有一个计数器,它们之间有多少步。
我尝试过暴力破解,从一个实体开始,获取所有主题,然后获取该主题的所有实体等等,但查询开始变得庞大。
源自@AKSW 的评论...
一个选项,不限制 skos:broader
路径长度,这将超过 public DBpedia 端点上的资源消耗限制,但在私有实例上可能是 运行 (in the cloud 或任何地方)您可以放宽这些限制的地方 --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader* ?cat .
dbr:IPhone
dct:subject/skos:broader* ?cat . }
简洁的选项,使用特定于 Virtuoso 的语法(基于 SPARQL 属性 路径的早期草案)来限制路径的长度(此处要求至少 1 skos:broader
并允许最多 3 ) --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ ?cat
^skos:broader{1,3}/^dct:subject
<http://dbpedia.org/resource/Apple_Inc.> ,
dbr:IPhone
}
另一个简洁的选项,这次使用标准 SPARQL Property Paths syntax 来限制路径的长度 --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ ?cat
^skos:broader/^skos:broader?/^skos:broader?/^dct:subject
<http://dbpedia.org/resource/Apple_Inc.> ,
dbr:IPhone
}
您还可以在 WHERE 子句中使用 2 条带有非反转路径的语句,首先是 Virtuoso 特定的形式 --
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader{1,3} ?cat .
dbr:IPhone
dct:subject/skos:broader{1,3} ?cat .
}
-- 然后在标准 SPARQL 中 --
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader/skos:broader?/skos:broader? ?cat .
dbr:IPhone
dct:subject/skos:broader/skos:broader?/skos:broader? ?cat .
}
我从文本中提取实体,大多数时候我会得到多个实体,例如 <http://dbpedia.org/resource/NASA>
、<http://dbpedia.org/resource/IPhone>
和 <http://dbpedia.org/resource/Apple_Inc.>
这两个实体,不共享 dct:subject
有没有办法查询路径以获取连接我的实体的主题列表?
我的目标是创建一种 "page rank",为给定实体找到最相关的主题。
最好有一个计数器,它们之间有多少步。
我尝试过暴力破解,从一个实体开始,获取所有主题,然后获取该主题的所有实体等等,但查询开始变得庞大。
源自@AKSW 的评论...
一个选项,不限制 skos:broader
路径长度,这将超过 public DBpedia 端点上的资源消耗限制,但在私有实例上可能是 运行 (in the cloud 或任何地方)您可以放宽这些限制的地方 --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader* ?cat .
dbr:IPhone
dct:subject/skos:broader* ?cat . }
简洁的选项,使用特定于 Virtuoso 的语法(基于 SPARQL 属性 路径的早期草案)来限制路径的长度(此处要求至少 1 skos:broader
并允许最多 3 ) --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ ?cat
^skos:broader{1,3}/^dct:subject
<http://dbpedia.org/resource/Apple_Inc.> ,
dbr:IPhone
}
另一个简洁的选项,这次使用标准 SPARQL Property Paths syntax 来限制路径的长度 --
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?cat
WHERE
{ ?cat
^skos:broader/^skos:broader?/^skos:broader?/^dct:subject
<http://dbpedia.org/resource/Apple_Inc.> ,
dbr:IPhone
}
您还可以在 WHERE 子句中使用 2 条带有非反转路径的语句,首先是 Virtuoso 特定的形式 --
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader{1,3} ?cat .
dbr:IPhone
dct:subject/skos:broader{1,3} ?cat .
}
-- 然后在标准 SPARQL 中 --
{ <http://dbpedia.org/resource/Apple_Inc.>
dct:subject/skos:broader/skos:broader?/skos:broader? ?cat .
dbr:IPhone
dct:subject/skos:broader/skos:broader?/skos:broader? ?cat .
}