如何使用SPARQL按行业筛选公司列表?

时间:2015-01-24 17:50:20

标签: regex sparql dbpedia

我正在尝试使用dbpedia和sparql创建特定行业类型(PaaS / SaaS)中的公司列表。我读了this post on creating a list of companies with a certain number of employees,我想在sparql查询中为特定行业过滤,例如:

https://gist.github.com/szydan/e801fa687587d9eb0f6a

我尝试了这个查询(在此省略前缀):

CONSTRUCT{
    ?iri a dbpedia-owl:Company;
         foaf:name ?companyName;
         dbpedia-owl:abstract ?description;
         owl:sameAs ?sameAs;
     dbpedia:countryCode ?countryCode;
         sindicetech:locationName ?locationName;
         sindicetech:locationCityName ?locationCityName
}WHERE{
  ?iri a dbpedia-owl:Company.
  OPTIONAL{  
       ?iri dbpedia-owl:abstract ?description.
       FILTER( lang(?description) = "en")
       FILTER (regex(?description, '^platform$')) .
  }
  {
    OPTIONAL{  
      ?iri foaf:name ?companyName.
      FILTER( lang(?companyName) = "en")
    }
  }UNION{
    OPTIONAL{     
      ?iri rdfs:label ?companyName .
      FILTER( lang(?companyName) = "en")
    }
  }
  OPTIONAL{     
      ?iri owl:sameAs ?sameAs
  } 
  {
    OPTIONAL{     
      ?iri dbpedia:locationCountry ?country.
      ?country dbpedia:countryCode ?countryCode 
      FILTER( lang(?countryCode) = "en")
    }
  }UNION{  
    OPTIONAL{     
      ?iri dbpedia-owl:locationCountry ?country.
      ?country dbpedia:countryCode ?countryCode 
      FILTER( lang(?countryCode) = "en")
    } 
  }
  OPTIONAL{
      ?iri dbpedia-owl:location ?location.
      ?location dbpedia:name ?locationName
      FILTER( lang(?locationName) = "en")
  }
  OPTIONAL{
      ?iri dbpedia-owl:locationCity ?locationCity.
      ?locationCity rdfs:label ?locationCityName
      FILTER( lang(?locationCityName) = "en")

  }
}
LIMIT 100

看看我是否可以找到平台作为服务公司...但我得到的各种结果在描述中没有这个词。也许FILTER (regex(?description, '^platform$'))正则表达式是错误的?有没有办法可以过滤:

?industrySector dbpedia-owl:industry <http://dbpedia.org/resource/Platform_as_a_service>

或许我应该尝试通过过滤本体论来缩小范围?

http://mappings.dbpedia.org/index.php/OntologyProperty:Industry

我正在使用DBPEDIA's Virtuoso来测试这些查询,理想情况下,我希望通过CONSTRUCT查询到达RDF类别层次结构,这样我就可以获得特定行业中的所有公司,例如PaaS ,SaaS等。但是我没有和CONSTRUCT查询结婚,我会接受任何建议!

1 个答案:

答案 0 :(得分:5)

改善您的查询

首先,两个音符。

  1. 您应该将语言标记与 langMatches 进行比较,而不是使用 lang(...)= ... 进行比较。
  2. SPARQL 1.1包含可以使用替换的属性路径,以及,从而可以指定变量的允许值。这意味着而不是:
  3.   {
        OPTIONAL{  
          ?iri foaf:name ?companyName.
          FILTER( lang(?companyName) = "en")
        }
      }UNION{
        OPTIONAL{     
          ?iri rdfs:label ?companyName .
          FILTER( lang(?companyName) = "en")
        }
      }
    

    或者

    optional { 
      ?iri rdfs:label|foaf:name ?companyName .
      filter langMatches(lang(?companyName),"en")
    }
    

    values ?nameProperty { rdfs:label foaf:name }
    optional { 
      ?iri ?nameProperty ?companyName .
      filter langMatches(lang(?companyName),"en")
    }
    

    属性路径也可以缩短查询的其他部分。例如,

    ?iri dbpedia-owl:locationCity ?locationCity.
    ?locationCity rdfs:label ?locationCityName
    

    可以只是:

    ?iri dbpedia-owl:locationCity/rdfs:label ?locationCityName
    

    因为你没有在任何地方使用?locationCity

    最后,至于

      

    我得到的各种结果都没有   描述。也许FILTER(正则表达式(?description,&#39; ^ platform $&#39;))   正则表达式错了吗?

    正则表达式并不能完全符合您的要求:

    FILTER (regex(?description, '^platform$'))
    

    只有当字符串中的字符恰好是&#34; platform&#34;时才会匹配。您似乎更想要检查描述是否包含字平台,在这种情况下,您可以使用contains,如包含(?description,& #34;平台&#34)即可。但即使你这样更新,你也会有

    optional {
      ?iri dbpedia-owl:abstract ?description.
      filter contains(?description,"platform")
      filter langMatches(lang(?description),"en")
    }
    

    并且仍在可选块中。 可选的重点是,即使可选部分不匹配,您也可以获得结果。如果您想要求包含单词platform的说明,请不要将其设为可选。

    毕竟,您的查询变为:

    prefix sindicetech: <urn:ex:sindicetech:>
    
    construct {
        ?iri a dbpedia-owl:Company ;
             foaf:name ?companyName ;
             dbpedia-owl:abstract ?description ;
             owl:sameAs ?sameAs ;
             dbpedia:countryCode ?countryCode ;
             sindicetech:locationName ?locationName ;
             sindicetech:locationCityName ?locationCityName
    }
    where {
      ?iri a dbpedia-owl:Company ;
           dbpedia-owl:abstract ?description .
      filter langMatches(lang(?description),"en") .
      filter contains(?description,"platform") .
      optional {
        ?iri foaf:name|rdfs:label ?companyName.
        filter langMatches(lang(?companyName),"en")
      }
      optional {     
        ?iri owl:sameAs ?sameAs
      } 
      optional {
        ?iri (dbpedia:locationCountry|dbpedia-owl:locationCountry)/dbpedia:countryCode ?countryCode .
        filter langMatches(lang(?countryCode),"en")
      }
      optional {
        ?iri dbpedia-owl:location/dbpedia:name ?locationName
        filter langMatches(lang(?locationName),"en")
      }
      optional {
        ?iri dbpedia-owl:locationCity/rdfs:label ?locationCityName
        filter langMatches(lang(?locationCityName),"en")
      }
    }
    limit 100
    

    SPARQL results

    您可以看到结果是关于公司在其说明中使用&#34; platform&#34; 的公司。

    请注意,它们都没有任何 dbpedia:countryCode 属性。我不知道你在哪里找到了这个属性,但它似乎没有在DBpedia的任何地方使用过。查询 select(count(*)as?n){?x dbpedia:countryCode?y} 返回 0

    一种不同的方法

      

    有没有办法可以过滤:

    ?industrySector dbpedia-owl:industry <http://dbpedia.org/resource/Platform_as_a_service>
    

    如果你看一下http://dbpedia.org/resource/Platform_as_a_service,你会发现它与许多公司(但不是那么多)有几个不同的属性:

    dpbedia triples

    您可能只是要求任何与任何财产相关的公司。例如,

    select distinct ?company where {
      ?company a dbpedia-owl:Company ;
               ?property dbpedia:Platform_as_a_service .
    }
    

    SPARQL results

    您也可以使用该方法来构建更详细的信息。我最终会得到这样的结果:

    prefix sindicetech: <urn:ex:sindicetech:>
    
    construct {
      ?company a dbpedia-owl:Company ;
               foaf:name ?label ;
               dbpedia-owl:abstract ?abstract ;
               owl:sameAs ?_company ;
               sindicetech:location [ sindicetech:city ?city ;
                                      sindicetech:country ?country ] .
    }
    where {
      ?company a dbpedia-owl:Company ;
               ?property dbpedia:Platform_as_a_service ;
               rdfs:label ?label ;
               dbpedia-owl:abstract ?abstract .
      filter langMatches(lang(?label),"en")
      filter langMatches(lang(?abstract),"en")
      optional {
        ?company owl:sameAs ?_company
      }
      optional { 
        ?company dbpedia-owl:location [ rdfs:label ?city ;
                                        dbpedia-owl:country/rdfs:label ?country ] .
        filter langMatches(lang(?city),"en")
        filter langMatches(lang(?country),"en")
      }
    }
    

    SPARQL results