Wikidata + SPARQL:根据股票代码查找公司

And*_*ndy 2 sparql wikidata

我正在尝试使用sparql查找基于其股票代码的公司。

此查询将列出企业及其代码(基本查询)

SELECT DISTINCT ?id ?idLabel ?ticker
WHERE {
    ?id wdt:P31/wdt:P279* wd:Q4830453 .
    ?id wdt:P249 ?ticker .
    ?id rdfs:label ?idLabel 
    FILTER(LANG(?idLabel) = 'en').
}
Run Code Online (Sandbox Code Playgroud)

但是,不包括IBM,因为IBM已将其股票代码放置在P414属性(证券交易所)的“内部”。

https://www.wikidata.org/wiki/Q37156

如何扩大此列表的范围,使其包括“内部”带有P414和P249代码的公司?

这是我可以显示不包括ibm的方法:

SELECT DISTINCT ?id ?idLabel ?exchange ?ticker2
WHERE {
    ?id wdt:P31/wdt:P279* wd:Q4830453 .
    ?id wdt:P249 ?ticker . FILTER(LCASE(STR(?ticker)) = 'ibm') .
    ?id rdfs:label ?idLabel 
    FILTER(LANG(?idLabel) = 'en').
}
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 5

因此,基于AKSWStanisla v的评论的答案是,此查询将列出纽约证券交易所的所有股票(只要股票代码在交易所“下方”列出:

SELECT DISTINCT ?id ?idLabel ?exchange ?ticker
WHERE {
    ?id wdt:P31/wdt:P279* wd:Q4830453 .
    ?id p:P414 ?exchange . 
    ?exchange ps:P414 wd:Q13677 .
    ?exchange pq:P249 ?ticker .

    ?id rdfs:label ?idLabel 
    FILTER(LANG(?idLabel) = 'en').
}
Run Code Online (Sandbox Code Playgroud)

此查询将在纽约证券交易所找到特定股票(IBM):

SELECT DISTINCT ?id ?idLabel ?exchange ?ticker
WHERE {
    ?id wdt:P31/wdt:P279* wd:Q4830453 .
    ?id p:P414 ?exchange . 
    ?exchange ps:P414 wd:Q13677 .
    ?exchange pq:P249 ?ticker . FILTER(LCASE(STR(?ticker)) = 'ibm') .

    ?id rdfs:label ?idLabel 
    FILTER(LANG(?idLabel) = 'en').
}
Run Code Online (Sandbox Code Playgroud)

此查询将在任何证券交易所找到特定的股票,或直接引用(此处显示两个不同的股票行情来说明搜索)。该查询之所以相当长,是因为Wikidata有时在置顶栏中包含证券交易所子字段,有时反之亦然。哦,有时它们一共是两个不同的字段(未链接)。噢,乔伊。

SELECT DISTINCT ?id ?idLabel ?exchange ?exchangeLabel ?ticker
WHERE {
    ?id wdt:P31/wdt:P279* wd:Q4830453 .
    { 
       # Find cases where the ticker is the main attribute, and the exchange may be below it.
       ?id wdt:P249 ?ticker . FILTER(LCASE(STR(?ticker)) = 'nsu') .
       ?id p:P249 ?tickersub .
       ?tickersub pq:P414 ?exchange 
    }
    UNION {
       # Find the exchange and it's ticker 
       ?id wdt:P414 ?exchange . 
       ?id p:P414 ?exchangesub .
       ?exchangesub pq:P249 ?ticker . FILTER(LCASE(STR(?ticker)) = 'ibm') .
    } 
    UNION {
       # Find the exchange and it's ticker 
       ?id wdt:P414 ?exchange . 
       ?id wdt:P249 ?ticker . FILTER(LCASE(STR(?ticker)) = 'frme') .
    } 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
Run Code Online (Sandbox Code Playgroud)