Example #1
0
def expand_group(node):
    if node.type.group is None or node.value is None:
        return
    value = str(node.value)
    query = {
        'query': {
            'term': {
                node.type.group: value
            }
        },
        '_source': {
            'includes': ['schema', 'properties']
        }
    }
    for res in scan(es, index=entities_index(), query=query):
        entity_id = res.get('_id')
        source = res.get('_source')
        properties = source.get('properties')
        schema = model.get(source.get('schema'))
        for prop in schema.properties.values():
            if prop.type != node.type:
                continue
            values = properties.get(prop.name)
            values = node.type.normalize_set(values)
            if value not in values:
                continue
            if prop.reverse:
                yield Link(node, prop.reverse, entity_id)
            else:
                yield Link(node, prop, entity_id, inverted=True)
Example #2
0
def expand_node(node):
    if node.type == registry.entity:
        yield from expand_entity(node.value)

    for entity_id, prop in iter_value_entities(node.type, node.value):
        if prop.reverse:
            yield Link(node, prop.reverse, entity_id)
        else:
            yield Link(node, prop, entity_id, inverted=True)
Example #3
0
    def test_base(self):
        prop = model.get_qname('Thing:name')
        node = Node(registry.entity, 'banana')
        link = Link(node, prop, "Theodore Böln")
        assert link.subject == node

        value = link.to_tuple()
        other = link.from_tuple(model, value)
        assert other == link, (link, other)
        assert hash(other) == hash(link)
        assert repr(other) == repr(link)
Example #4
0
def load_links(node):
    degree_key = typed_key(node, DEGREE)
    if cache.kv.get(degree_key) is None:
        raise CacheMiss()
    key = typed_key(node)
    for packed in cache.kv.lrange(key, 0, -1):
        data = msgpack.unpackb(packed, raw=False)
        data = tuple((node, *data))
        link = Link.from_tuple(model, data)
        if link is not None:
            yield link
Example #5
0
def expand_entity(entity):
    """Transform an entity into a set of statements. This can
    accept either an entity object or an entity ID."""
    if not is_mapping(entity):
        entity = get_entity(entity)
    if entity is None:
        return

    proxy = model.get_proxy(entity)
    yield from proxy.links

    # TODO: factor out inference
    thing = model.get(Entity.THING)
    if proxy.schema.is_a(thing):
        sameAs = thing.get("sameAs")
        for (score, _, other) in xref_item(proxy):
            yield Link(proxy.node,
                       sameAs,
                       other.id,
                       weight=score,
                       inferred=True)
Example #6
0
    def test_invert(self):
        prop = model.get_qname('Thing:name')
        node = Node(registry.entity, 'banana')
        link = Link(node, prop, "Theodore")
        assert not link.inverted
        inv = link.invert()
        assert inv.inverted
        assert inv.rdf() is None

        banana = Node(registry.entity, 'banana')
        peach = Node(registry.entity, 'peach')
        prop = model.get_qname('Thing:sameAs')
        link = Link(banana, prop, peach.value)
        inv = link.invert()
        assert inv.subject == peach
        assert inv.value_node == banana
        assert inv.prop == link.prop
Example #7
0
 def links(self):
     node = self.node
     if node is None:
         return
     for prop, value in self.itervalues():
         yield Link(node, prop, value)
Example #8
0
    def test_graph(self):
        g = DiGraph()
        proxy = model.get_proxy(ENTITY)
        node = proxy.node
        self.assertEqual(str(node), node.id)
        for link in proxy.links:
            link.to_digraph(g)
        self.assertEqual(g.number_of_edges(), 8)
        self.assertEqual(g.number_of_nodes(), 9)
        self.assertIn(node.id, g.nodes)

        prop = model.get_qname('Thing:name')
        link = Link(Node(registry.name, 'Bob'), prop, proxy.id, inverted=True)
        link.to_digraph(g)
        self.assertEqual(g.number_of_edges(), 9)

        link = Link(node, prop, 'Blub', weight=0)
        link.to_digraph(g)
        self.assertEqual(g.number_of_edges(), 9)

        prop = model.get_qname('Thing:summary')
        link = Link(node, prop, 'This is a text')
        link.to_digraph(g)
        self.assertEqual(g.number_of_edges(), 9)