예제 #1
0
    def testQueryApiGetter(self):
        """Test that we can actually retreive data and that caching works."""
        w = query.WikidataQuery(cacheMaxAge=0)

        # this query doesn't return any items, save a bit of bandwidth!
        q = query.HasClaim(105).AND([query.NoClaim(225), query.HasClaim(100)])

        # check that the cache file is created
        cacheFile = w.getCacheFilename(w.getQueryString(q, [], []))

        # remove existing cache file
        try:
            os.remove(cacheFile)
        except OSError:
            pass

        data = w.query(q)

        self.assertFalse(os.path.exists(cacheFile))

        w = query.WikidataQuery(cacheMaxAge=0.1)

        data = w.query(q)

        self.assertTrue(os.path.exists(cacheFile))

        self.assertIn('status', data)
        self.assertIn('items', data)

        t1 = time.time()
        data = w.query(q)
        t2 = time.time()

        # check that the cache access is fast
        self.assertLess(t2 - t1, 0.2)
예제 #2
0
    def testQueriesWDStructures(self):
        """
        Queries using Wikibase page structures like ItemPage
        """

        q = query.HasClaim(PropertyPage(self.repo, "P99"))
        self.assertEqual(str(q), "claim[99]")

        q = query.HasClaim(PropertyPage(self.repo, "P99"),
                           ItemPage(self.repo, "Q100"))
        self.assertEqual(str(q), "claim[99:100]")

        q = query.HasClaim(99, [100, PropertyPage(self.repo, "P101")])
        self.assertEqual(str(q), "claim[99:100,101]")

        q = query.StringClaim(PropertyPage(self.repo, "P99"), "Hello")
        self.assertEqual(str(q), 'string[99:"Hello"]')

        q = query.Tree(ItemPage(self.repo, "Q92"), [1], 2)
        self.assertEqual(str(q), 'tree[92][1][2]')

        q = query.Tree(ItemPage(self.repo, "Q92"),
                       [PropertyPage(self.repo, "P101")], 2)
        self.assertEqual(str(q), 'tree[92][101][2]')

        self.assertRaises(
            TypeError, lambda: query.Tree(PropertyPage(
                self.repo, "P92"), [PropertyPage(self.repo, "P101")], 2))

        c = pywikibot.Coordinate(50, 60)
        q = query.Around(PropertyPage(self.repo, "P625"), c, 23.4)
        self.assertEqual(str(q), 'around[625,50,60,23.4]')

        begin = pywikibot.WbTime(site=self.repo, year=1999)
        end = pywikibot.WbTime(site=self.repo, year=2010, hour=1)

        # note no second comma
        q = query.Between(PropertyPage(self.repo, "P569"), begin)
        self.assertEqual(str(q), 'between[569,+00000001999-01-01T00:00:00Z]')

        q = query.Between(PropertyPage(self.repo, "P569"), end=end)
        self.assertEqual(str(q), 'between[569,,+00000002010-01-01T01:00:00Z]')

        q = query.Between(569, begin, end)
        self.assertEqual(
            str(q),
            'between[569,+00000001999-01-01T00:00:00Z,+00000002010-01-01T01:00:00Z]'
        )

        # try negative year
        begin = pywikibot.WbTime(site=self.repo, year=-44)
        q = query.Between(569, begin, end)
        self.assertEqual(
            str(q),
            'between[569,-00000000044-01-01T00:00:00Z,+00000002010-01-01T01:00:00Z]'
        )
예제 #3
0
def main():
    """Main script of airport dabatase creation."""
    from argparse import ArgumentParser

    parser = ArgumentParser(description="Airport DB")
    parser.add_argument("-f",
                        "--f",
                        type=str,
                        dest="output",
                        metavar="FILE",
                        required=True,
                        help="output file")
    args = parser.parse_args()

    with open(args.output, 'w', 0) as output:

        site = pywikibot.Site("fr", "wikipedia")
        repo = site.data_repository()

        # retrieve airport list
        query = pwq.HasClaim(31, items=[1248784])
        dat = pwq.WikidataQuery(cacheMaxAge=600).query(query)
        items = dat['items']
        print "Found %d items for query: %s\n" % (len(items), query)
        for i in items:
            item = item_from_id(repo, i)
            item.get()
            name = ''
            if 'enwiki' in item.sitelinks:
                name = item.sitelinks['enwiki']
            coordinate = fetch_property_values(item, 'P625')
            latitude = ''
            longitude = ''
            if coordinate is not None:
                latitude = coordinate.lat
                longitude = coordinate.lon
            airport = Airport(iata=fetch_property_values(item, 'P238'),
                              icao=fetch_property_values(item, 'P239'),
                              geo="%s, %s" % (latitude, longitude),
                              country=fetch_property_values(item, 'P17'),
                              en=name)
            output.write(repr(airport) + '\n')
예제 #4
0
    def testQueries(self):
        """
        Test Queries and check whether they're behaving correctly.

        Check that we produce the expected query strings and that
        invalid inputs are rejected correctly
        """
        q = query.HasClaim(99)
        self.assertEqual(str(q), "claim[99]")

        q = query.HasClaim(99, 100)
        self.assertEqual(str(q), "claim[99:100]")

        q = query.HasClaim(99, [100])
        self.assertEqual(str(q), "claim[99:100]")

        q = query.HasClaim(99, [100, 101])
        self.assertEqual(str(q), "claim[99:100,101]")

        q = query.NoClaim(99, [100, 101])
        self.assertEqual(str(q), "noclaim[99:100,101]")

        q = query.StringClaim(99, "Hello")
        self.assertEqual(str(q), 'string[99:"Hello"]')

        q = query.StringClaim(99, ["Hello"])
        self.assertEqual(str(q), 'string[99:"Hello"]')

        q = query.StringClaim(99, ["Hello", "world"])
        self.assertEqual(str(q), 'string[99:"Hello","world"]')

        self.assertRaises(TypeError, lambda: query.StringClaim(99, 2))

        q = query.Tree(92, [1], 2)
        self.assertEqual(str(q), 'tree[92][1][2]')

        # missing third arg
        q = query.Tree(92, 1)
        self.assertEqual(str(q), 'tree[92][1][]')

        # missing second arg
        q = query.Tree(92, reverse=3)
        self.assertEqual(str(q), 'tree[92][][3]')

        q = query.Tree([92, 93], 1, [2, 7])
        self.assertEqual(str(q), 'tree[92,93][1][2,7]')

        # bad tree arg types
        self.assertRaises(TypeError, lambda: query.Tree(99, "hello"))

        q = query.Link("enwiki")
        self.assertEqual(str(q), 'link[enwiki]')

        q = query.NoLink(["enwiki", "frwiki"])
        self.assertEqual(str(q), 'nolink[enwiki,frwiki]')

        # bad link arg types
        self.assertRaises(TypeError, lambda: query.Link(99))
        self.assertRaises(TypeError, lambda: query.Link([99]))

        # HasClaim with tree as arg
        q = query.HasClaim(99, query.Tree(1, 2, 3))
        self.assertEqual(str(q), "claim[99:(tree[1][2][3])]")

        q = query.HasClaim(99, query.Tree(1, [2, 5], [3, 90]))
        self.assertEqual(str(q), "claim[99:(tree[1][2,5][3,90])]")
예제 #5
0
    def testQuerySets(self):
        """Test that we can join queries together correctly."""
        # construct via queries
        qs = query.HasClaim(99, 100).AND(query.HasClaim(99, 101))

        self.assertEqual(str(qs), 'claim[99:100] AND claim[99:101]')

        self.assertEqual(repr(qs), 'QuerySet(claim[99:100] AND claim[99:101])')

        qs = query.HasClaim(99, 100).AND(query.HasClaim(99, 101)).AND(
            query.HasClaim(95))

        self.assertEqual(str(qs),
                         'claim[99:100] AND claim[99:101] AND claim[95]')

        # construct via queries
        qs = query.HasClaim(99, 100).AND(
            [query.HasClaim(99, 101),
             query.HasClaim(95)])

        self.assertEqual(str(qs),
                         'claim[99:100] AND claim[99:101] AND claim[95]')

        qs = query.HasClaim(99, 100).OR(
            [query.HasClaim(99, 101),
             query.HasClaim(95)])

        self.assertEqual(str(qs),
                         'claim[99:100] OR claim[99:101] OR claim[95]')

        q1 = query.HasClaim(99, 100)
        q2 = query.HasClaim(99, 101)

        # different joiners get explicit grouping parens (the api also allows
        # implicit, but we don't do that)
        qs1 = q1.AND(q2)
        qs2 = q1.OR(qs1).AND(query.HasClaim(98))

        self.assertEqual(
            str(qs2),
            '(claim[99:100] OR (claim[99:100] AND claim[99:101])) AND claim[98]'
        )

        # if the joiners are the same, no need to group
        qs1 = q1.AND(q2)
        qs2 = q1.AND(qs1).AND(query.HasClaim(98))

        self.assertEqual(
            str(qs2),
            'claim[99:100] AND claim[99:100] AND claim[99:101] AND claim[98]')

        qs1 = query.HasClaim(100).AND(query.HasClaim(101))
        qs2 = qs1.OR(query.HasClaim(102))

        self.assertEqual(str(qs2), '(claim[100] AND claim[101]) OR claim[102]')

        qs = query.Link("enwiki").AND(query.NoLink("dewiki"))

        self.assertEqual(str(qs), 'link[enwiki] AND nolink[dewiki]')
예제 #6
0
# -*- coding: utf-8  -*-
import pywikibot
import pywikibot.data.wikidataquery as pwq
import json

site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
#page = pywikibot.Page(site, u"Raimond de Prinhac")
#item = pywikibot.ItemPage.fromPage(page)
#dictionary = item.get()
#print dictionary

# define repo
site = pywikibot.Site("fr", "wikipedia")
repo = site.data_repository()

# retrieve airport list 106:2937507
q= pwq.HasClaim(106, items=[2937507])
dat = pwq.WikidataQuery(cacheMaxAge=600).query(q)
items = dat['items']
for i in items:
    item = pywikibot.ItemPage(repo, "Q%s" % i)
    item.get()
    print item.labels