Hypergraph operations

An hypergraph can also be seen as a type of database, that stores knowledge in the form of sets of hyperedges, and provides functions that make it easy to add and search for hyperedges in useful ways. We will see here how to perform some fundamental tasks with hypergraphs.

The notebook for this tutorial can be found here:


Form here on, the following imports are assumed:

from graphbrain import *
from graphbrain.notebook import *
from graphbrain.parsers import *

Create an hypergraph

Creating an hypergraph is straightforward:

hg = hgraph('example.hg')

This assigns a hypergraph instance to hg, which is physically stored as ‘example.hg’. If this hypergraph already exists, it is simply opened. If it does not exist, and empty one is created.

Parse sentence and add hyperedge to hypergraph

Let’s create a parser to obtain an hyperedge from a sentence, and then add it to the hypergraph:

parser = create_parser(name='en')
text = "Mary is playing a very old violin."

parses = parser.parse(text)
for parse in parses:
    edge = parse['main_edge']

Notice that the add() function works recursively. We will see in the next subsection that not only the top hyperedge, but all of their children are added to the hypergraph.

Iterate through all edges

Hyoergraph objects include the function all(), which returns an iterator that can be used to transverse all the hyperedges contained in the hypergraph. Let’s see and example, in this case assuming that we are in a notebook environment:

for edge in hg.all():
    show(edge, style='oneline')
((is/av.|f--3s-/en playing/pd.so.|pg----/en) mary/cp.s/en [a/md/en [(very/w/en old/ma/en) violin/cc.s/en]])
[(very/w/en old/ma/en) violin/cc.s/en]
[a/md/en [(very/w/en old/ma/en) violin/cc.s/en]]
(is/av.|f--3s-/en playing/pd.so.|pg----/en)
(very/w/en old/ma/en)

Search with patterns

Hypergraph objects have a generic search() function, which returns iterators corresponding to sets of hyperedges that match a given pattern.

edge_iterator = hg.search(pattern)

For example, with the current hypergraph, the executing the below code would produce the shown result:

# '...' at the end indicates that the edge may have an arbitrary number of extra entities
for edge in hg.search('((is/av.|f--3s-/en playing/pd.so.|pg----/en) ...)'):
    show(edge, style='oneline')
((is/av.|f--3s-/en playing/pd.so.|pg----/en) mary/cp.s/en [a/md/en [(very/w/en old/ma/en) violin/cc.s/en]])

For all the details about how to define search patterns, refer to the search() function documentation: