Beispiel #1
0
 def setUp(self):
     try:
         rmtree('/tmp/ajgudb')
     except OSError:
         pass
     os.makedirs('/tmp/ajgudb')
     self.graph = AjguDB('/tmp/ajgudb')
Beispiel #2
0
class DatabaseTestCase(TestCase):

    storage_class = None

    def setUp(self):
        os.makedirs('/tmp/ajgudb')
        self.graph = AjguDB('/tmp/ajgudb', self.storage_class)

    def tearDown(self):
        self.graph.close()
        rmtree('/tmp/ajgudb')
Beispiel #3
0
 def setUp(self):
     try:
         rmtree('/tmp/ajgudb')
     except OSError:
         pass
     os.makedirs('/tmp/ajgudb')
     self.graph = AjguDB('/tmp/ajgudb')
Beispiel #4
0
def load():
    from ajgudb import AjguDB
    print('build database at db')
    db = AjguDB('./db/')

    # add index on name
    db.vertex.index('name')

    for index in range(8):
        name = 'data/assertions/part_0{}.msgpack'.format(index)
        with open(name, 'rb') as stream:
            print(name)
            unpacker = Unpacker(stream, encoding='utf-8')
            for value in unpacker:
                start = value.pop('start').encode('utf-8')
                end = value.pop('end').encode('utf-8')
                # only import english concepts
                if not (start.startswith('/c/en/')
                        and end.startswith('/c/en/')):
                    continue
                start = get_or_create(db, 'concept/item', 'name', start)
                end = get_or_create(db, 'concept/item', 'name', end)

                # do not include the following keys
                value.pop(u'sources')
                value.pop(u'features')
                value.pop(u'source_uri')
                value.pop(u'dataset')
                value.pop(u'license')
                value.pop(u'uri')
                value.pop(u'id')

                # convert unicode keys into byte/str keys
                value = {key.encode('utf-8'): value[key] for key in value.keys()}  # noqa
                start.link('concept/relation', end,  **value)
    db.close()
Beispiel #5
0
                row = ''
            else:
                row += char
    if row:
        # yield the very last row if any
        yield row.split('\t')


COOL = re.compile(r'^/c/en/[\w_]+$')

def wordify(concept):
    return concept[len('/c/en/'):].replace('_', ' ')

if __name__ == '__main__':
    args = docopt(__doc__)
    graph = AjguDB(args['--database'], logging=True)
    if args['conceptnet'] and args['load']:
        edges = chunks_to_rows(gzip_to_chunks(args['FILENAME']))
        for edge in edges:
            _, relation, start, end, _ = edge
            # index only cool concepts
            if COOL.search(start) and COOL.search(end):
                with graph.transaction():
                    # get or create start
                    start = Vertex(ref=start, concept=wordify(start))
                    new, start = graph.get_or_create(start)
                    if new:
                        graph.index(start, start['concept'])
                    # get or create end
                    end = Vertex(ref=end, concept=wordify(end))
                    new, end = graph.get_or_create(end)
Beispiel #6
0
class TestGremlin(TestCase):
    def setUp(self):
        try:
            rmtree('/tmp/ajgudb')
        except OSError:
            pass
        os.makedirs('/tmp/ajgudb')
        self.graph = AjguDB('/tmp/ajgudb')

    def tearDown(self):
        self.graph.close()
        rmtree('/tmp/ajgudb')

    def test_where(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'), ok=True)
        seed.link('test', self.graph.vertex.create('two'), ok=True)
        seed.link('test', self.graph.vertex.create('one'), ok=False)
        query = gremlin.query(gremlin.outgoings, gremlin.where(ok=True))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 2)

    def test_skip(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'))
        seed.link('test', self.graph.vertex.create('two'))
        seed.link('test', self.graph.vertex.create('one'))
        query = gremlin.query(gremlin.outgoings, gremlin.skip(2))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 1)

    def test_select_and_key_index_vertices(self):
        self.graph.vertex.key_index('key')

        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='two')
        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='two')
        self.graph.vertex.create('seed', key='one')

        query = gremlin.query(gremlin.select_vertices(key='one'),
                              gremlin.count)
        count = query(self.graph)
        self.assertEqual(count, 4)

    def test_select_and_key_index_edges(self):
        self.graph.edge.key_index('key')

        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')

        start.link('link', end, key='two')
        start.link('link', end, key='two')
        start.link('link', end, key='one')

        query = gremlin.query(gremlin.select_edges(key='one'), gremlin.count)
        count = query(self.graph)
        self.assertEqual(count, 1)

    def test_limit(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'))
        seed.link('test', self.graph.vertex.create('two'))
        seed.link('test', self.graph.vertex.create('one'))
        query = gremlin.query(gremlin.outgoings, gremlin.limit(2))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 2)

    # def test_paginator(self):
    #     seed = self.graph.vertex('seed')
    #     list(map(lambda x: seed.link('test', self.graph.vertex()), range(20)))
    #     self.assertEqual(seed.outgoings().paginator(5).count(), 5)
    #     self.assertEqual(seed.outgoings().paginator(5).count(), 5)

    def test_outgoings(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        other.link('test', self.graph.vertex.create('test'))
        other.link('test', self.graph.vertex.create('test'))
        query = gremlin.query(gremlin.outgoings, gremlin.end,
                              gremlin.outgoings, gremlin.count)
        self.assertEqual(query(self.graph, seed), 2)

    def test_incomings(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        link = seed.link('test', other)
        query = gremlin.query(gremlin.incomings, gremlin.get)
        self.assertEqual(query(self.graph, other), [link])

    def test_incomings_two(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        query = gremlin.query(gremlin.incomings, gremlin.start, gremlin.get)
        self.assertEqual(query(self.graph, other), [seed])

    def test_path(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        link = seed.link('test', other)
        query = gremlin.query(
            gremlin.incomings,
            gremlin.start,
            gremlin.path(2),
            gremlin.each(gremlin.get),
            gremlin.value,
        )
        path = next(query(self.graph, other))
        self.assertEqual(path, [seed, link, other])

    def test_incomings_three(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        end = self.graph.vertex.create('test')
        other.link('test', end)
        query = gremlin.query(gremlin.incomings, gremlin.start,
                              gremlin.incomings, gremlin.start, gremlin.get)
        self.assertEqual(query(self.graph, end), [seed])

    def test_order(self):
        seed = self.graph.vertex.create('test')
        seed.link('test', self.graph.vertex.create('test', value=5))
        seed.link('test', self.graph.vertex.create('test', value=4))
        seed.link('test', self.graph.vertex.create('test', value=1))

        query = gremlin.query(gremlin.outgoings, gremlin.end,
                              gremlin.key('value'), gremlin.value)
        # the order is not guaranteed..
        self.assertEqual(set(query(self.graph, seed)), set([5, 4, 1]))

        query = gremlin.query(gremlin.outgoings, gremlin.end,
                              gremlin.key('value'), gremlin.sort(),
                              gremlin.value)
        self.assertEqual(list(query(self.graph, seed)), [1, 4, 5])

    def test_unique(self):
        seed = self.graph.vertex.create('test')
        seed.link('test', self.graph.vertex.create('test', value=1))
        seed.link('test', self.graph.vertex.create('test', value=1))
        seed.link('test', self.graph.vertex.create('test', value=1))
        query = gremlin.query(gremlin.outgoings, gremlin.end,
                              gremlin.key('value'), gremlin.unique,
                              gremlin.value)
        results = list(query(self.graph, seed))
        self.assertEqual(results, [1])
Beispiel #7
0
class DatabaseTestCase(TestCase):
    def setUp(self):
        try:
            rmtree('/tmp/ajgudb')
        except OSError:
            pass
        os.makedirs('/tmp/ajgudb')
        self.graph = AjguDB('/tmp/ajgudb')

    def tearDown(self):
        self.graph.close()
        rmtree('/tmp/ajgudb')

    def test_create_vertex(self):
        v = self.graph.vertex.create('test')
        self.assertTrue(v)

    def test_idem(self):
        v = self.graph.vertex.create('test')
        idem = self.graph.vertex.get(v.uid)
        self.assertEqual(v, idem)

    def test_different_same_type(self):
        v1 = self.graph.vertex.create('test')
        v2 = self.graph.vertex.create('test')
        self.assertNotEqual(v1, v2)

    def test_different_different_type(self):
        start = self.graph.vertex.create('test')
        end = self.graph.vertex.create('test')
        edge = start.link('link', end)
        self.assertNotEqual(start, edge)

    def test_get_or_create(self):
        v = self.graph.vertex.get_or_create('test')
        self.assertIsNotNone(v)

    def test_get_or_create_twice(self):
        v1 = self.graph.vertex.get_or_create(label='test', key='value')
        v2 = self.graph.vertex.get_or_create(label='test', key='value')
        self.assertEqual(v1, v2)

    def test_create_and_get_vertex(self):
        v1 = self.graph.vertex.create('test')
        v2 = self.graph.vertex.get(v1.uid)
        self.assertTrue(v1, v2)

    def test_create_with_properties_and_get_vertex(self):
        v = self.graph.vertex.create('test', key='value')
        v = self.graph.vertex.get(v.uid)
        self.assertEqual(v['key'], 'value')

    def test_create_modify_and_get_edge(self):
        start = self.graph.vertex.create('test')
        end = self.graph.vertex.create('test')
        edge = start.link('edge', end, hello='world')

        edge = self.graph.edge.get(edge.uid)

        self.assertTrue(edge['hello'] == 'world')
        self.assertEqual(edge.start(), start)
        self.assertEqual(edge.end(), end)

    def test_create_edge_and_check_vertices_edges(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        start.link('edge', end)

        # retrieve start and end
        start = self.graph.vertex.get(start.uid)
        end = self.graph.vertex.get(end.uid)

        self.assertTrue(start.outgoings())
        self.assertTrue(end.incomings())

    def test_set_get_set_get(self):
        self.graph.set('key', 'value')
        self.assertEqual(self.graph.get('key'), 'value')
        self.graph.set('key', 'value deux')
        self.assertEqual(self.graph.get('key'), 'value deux')

    def test_set_get(self):
        self.graph.set('key', 'value')
        self.assertEqual(self.graph.get('key'), 'value')

    def test_set_get_dict(self):
        expected = dict(key='value')
        self.graph.set('key', expected)
        self.assertEqual(self.graph.get('key'), expected)

    def test_set_remove_get(self):
        self.graph.set('key', 'value')
        self.graph.remove('key')
        with self.assertRaises(KeyError):
            self.graph.get('key')

    def test_remove(self):
        with self.assertRaises(KeyError):
            self.graph.remove('key')

    def test_delete_vertex(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        start.link('edge', end)
        start.delete()
        self.assertEqual(len(end.incomings()), 0)
        with self.assertRaises(KeyError):
            self.graph.vertex.get(start.uid)

    def test_delete_edge(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        edge = start.link('edge', end)
        start.delete()
        self.assertEqual(len(start.outgoings()), 0)
        self.assertEqual(len(end.incomings()), 0)
        with self.assertRaises(KeyError):
            self.graph.edge.get(edge.uid)

    def test_update_vertex(self):
        start = self.graph.vertex.create('start', key='value')
        self.assertEqual(start['key'], 'value')
        start['key'] = 'monkey'
        start.save()
        self.assertEqual(start['key'], 'monkey')

    def test_update_edge(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        edge = start.link('link', end, key='value')
        self.assertEqual(edge['key'], 'value')
        edge['key'] = 'monkey'
        edge.save()
        self.assertEqual(edge['key'], 'monkey')
Beispiel #8
0
 def setUp(self):
     os.makedirs('/tmp/ajgudb')
     self.graph = AjguDB('/tmp/ajgudb', self.storage_class)
Beispiel #9
0
class TestGremlin(TestCase):

    def setUp(self):
        try:
            rmtree('/tmp/ajgudb')
        except OSError:
            pass
        os.makedirs('/tmp/ajgudb')
        self.graph = AjguDB('/tmp/ajgudb')

    def tearDown(self):
        self.graph.close()
        rmtree('/tmp/ajgudb')

    def test_where(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'), ok=True)
        seed.link('test', self.graph.vertex.create('two'), ok=True)
        seed.link('test', self.graph.vertex.create('one'), ok=False)
        query = gremlin.query(gremlin.outgoings, gremlin.where(ok=True))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 2)

    def test_skip(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'))
        seed.link('test', self.graph.vertex.create('two'))
        seed.link('test', self.graph.vertex.create('one'))
        query = gremlin.query(gremlin.outgoings, gremlin.skip(2))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 1)

    def test_select_and_key_index_vertices(self):
        self.graph.vertex.key_index('key')

        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='two')
        self.graph.vertex.create('seed', key='one')
        self.graph.vertex.create('seed', key='two')
        self.graph.vertex.create('seed', key='one')

        query = gremlin.query(
            gremlin.select_vertices(key='one'),
            gremlin.count
        )
        count = query(self.graph)
        self.assertEqual(count, 4)

    def test_select_and_key_index_edges(self):
        self.graph.edge.key_index('key')

        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')

        start.link('link', end, key='two')
        start.link('link', end, key='two')
        start.link('link', end, key='one')

        query = gremlin.query(
            gremlin.select_edges(key='one'),
            gremlin.count
        )
        count = query(self.graph)
        self.assertEqual(count, 1)

    def test_limit(self):
        seed = self.graph.vertex.create('seed')
        seed.link('test', self.graph.vertex.create('one'))
        seed.link('test', self.graph.vertex.create('two'))
        seed.link('test', self.graph.vertex.create('one'))
        query = gremlin.query(gremlin.outgoings, gremlin.limit(2))
        count = len(list(query(self.graph, seed)))
        self.assertEqual(count, 2)

    # def test_paginator(self):
    #     seed = self.graph.vertex('seed')
    #     list(map(lambda x: seed.link('test', self.graph.vertex()), range(20)))
    #     self.assertEqual(seed.outgoings().paginator(5).count(), 5)
    #     self.assertEqual(seed.outgoings().paginator(5).count(), 5)

    def test_outgoings(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        other.link('test', self.graph.vertex.create('test'))
        other.link('test', self.graph.vertex.create('test'))
        query = gremlin.query(gremlin.outgoings, gremlin.end, gremlin.outgoings, gremlin.count)
        self.assertEqual(query(self.graph, seed), 2)

    def test_incomings(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        link = seed.link('test', other)
        query = gremlin.query(gremlin.incomings, gremlin.get)
        self.assertEqual(query(self.graph, other), [link])

    def test_incomings_two(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        query = gremlin.query(gremlin.incomings, gremlin.start, gremlin.get)
        self.assertEqual(query(self.graph, other), [seed])

    def test_path(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        link = seed.link('test', other)
        query = gremlin.query(
            gremlin.incomings,
            gremlin.start,
            gremlin.path(2),
            gremlin.each(gremlin.get),
            gremlin.value,
        )
        path = next(query(self.graph, other))
        self.assertEqual(path, [seed, link, other])

    def test_incomings_three(self):
        seed = self.graph.vertex.create('test')
        other = self.graph.vertex.create('test')
        seed.link('test', other)
        end = self.graph.vertex.create('test')
        other.link('test', end)
        query = gremlin.query(gremlin.incomings, gremlin.start, gremlin.incomings, gremlin.start, gremlin.get)
        self.assertEqual(query(self.graph, end), [seed])

    def test_order(self):
        seed = self.graph.vertex.create('test')
        seed.link('test', self.graph.vertex.create('test', value=5))
        seed.link('test', self.graph.vertex.create('test', value=4))
        seed.link('test', self.graph.vertex.create('test', value=1))

        query = gremlin.query(gremlin.outgoings, gremlin.end, gremlin.key('value'), gremlin.value)
        # the order is not guaranteed..
        self.assertEqual(set(query(self.graph, seed)), set([5, 4, 1]))

        query = gremlin.query(gremlin.outgoings, gremlin.end, gremlin.key('value'), gremlin.sort(), gremlin.value)
        self.assertEqual(list(query(self.graph, seed)), [1, 4, 5])

    def test_unique(self):
        seed = self.graph.vertex.create('test')
        seed.link('test', self.graph.vertex.create('test', value=1))
        seed.link('test', self.graph.vertex.create('test', value=1))
        seed.link('test', self.graph.vertex.create('test', value=1))
        query = gremlin.query(gremlin.outgoings, gremlin.end, gremlin.key('value'), gremlin.unique, gremlin.value)
        results = list(query(self.graph, seed))
        self.assertEqual(results, [1])
Beispiel #10
0
class DatabaseTestCase(TestCase):

    def setUp(self):
        try:
            rmtree('/tmp/ajgudb')
        except OSError:
            pass
        os.makedirs('/tmp/ajgudb')
        self.graph = AjguDB('/tmp/ajgudb')

    def tearDown(self):
        self.graph.close()
        rmtree('/tmp/ajgudb')

    def test_create_vertex(self):
        v = self.graph.vertex.create('test')
        self.assertTrue(v)

    def test_idem(self):
        v = self.graph.vertex.create('test')
        idem = self.graph.vertex.get(v.uid)
        self.assertEqual(v, idem)

    def test_different_same_type(self):
        v1 = self.graph.vertex.create('test')
        v2 = self.graph.vertex.create('test')
        self.assertNotEqual(v1, v2)

    def test_different_different_type(self):
        start = self.graph.vertex.create('test')
        end = self.graph.vertex.create('test')
        edge = start.link('link', end)
        self.assertNotEqual(start, edge)

    def test_get_or_create(self):
        v = self.graph.vertex.get_or_create('test')
        self.assertIsNotNone(v)

    def test_get_or_create_twice(self):
        v1 = self.graph.vertex.get_or_create(label='test', key='value')
        v2 = self.graph.vertex.get_or_create(label='test', key='value')
        self.assertEqual(v1, v2)

    def test_create_and_get_vertex(self):
        v1 = self.graph.vertex.create('test')
        v2 = self.graph.vertex.get(v1.uid)
        self.assertTrue(v1, v2)

    def test_create_with_properties_and_get_vertex(self):
        v = self.graph.vertex.create('test', key='value')
        v = self.graph.vertex.get(v.uid)
        self.assertEqual(v['key'], 'value')

    def test_create_modify_and_get_edge(self):
        start = self.graph.vertex.create('test')
        end = self.graph.vertex.create('test')
        edge = start.link('edge', end, hello='world')

        edge = self.graph.edge.get(edge.uid)

        self.assertTrue(edge['hello'] == 'world')
        self.assertEqual(edge.start(), start)
        self.assertEqual(edge.end(), end)

    def test_create_edge_and_check_vertices_edges(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        start.link('edge', end)

        # retrieve start and end
        start = self.graph.vertex.get(start.uid)
        end = self.graph.vertex.get(end.uid)

        self.assertTrue(start.outgoings())
        self.assertTrue(end.incomings())

    def test_set_get_set_get(self):
        self.graph.set('key', 'value')
        self.assertEqual(self.graph.get('key'), 'value')
        self.graph.set('key', 'value deux')
        self.assertEqual(self.graph.get('key'), 'value deux')

    def test_set_get(self):
        self.graph.set('key', 'value')
        self.assertEqual(self.graph.get('key'), 'value')

    def test_set_get_dict(self):
        expected = dict(key='value')
        self.graph.set('key', expected)
        self.assertEqual(self.graph.get('key'), expected)

    def test_set_remove_get(self):
        self.graph.set('key', 'value')
        self.graph.remove('key')
        with self.assertRaises(KeyError):
            self.graph.get('key')

    def test_remove(self):
        with self.assertRaises(KeyError):
            self.graph.remove('key')

    def test_delete_vertex(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        start.link('edge', end)
        start.delete()
        self.assertEqual(len(end.incomings()), 0)
        with self.assertRaises(KeyError):
            self.graph.vertex.get(start.uid)

    def test_delete_edge(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        edge = start.link('edge', end)
        start.delete()
        self.assertEqual(len(start.outgoings()), 0)
        self.assertEqual(len(end.incomings()), 0)
        with self.assertRaises(KeyError):
            self.graph.edge.get(edge.uid)

    def test_update_vertex(self):
        start = self.graph.vertex.create('start', key='value')
        self.assertEqual(start['key'], 'value')
        start['key'] = 'monkey'
        start.save()
        self.assertEqual(start['key'], 'monkey')

    def test_update_edge(self):
        start = self.graph.vertex.create('start')
        end = self.graph.vertex.create('end')
        edge = start.link('link', end, key='value')
        self.assertEqual(edge['key'], 'value')
        edge['key'] = 'monkey'
        edge.save()
        self.assertEqual(edge['key'], 'monkey')