Skip to content

RelationalAI Graph Reasoner

The RelationalAI Graph Reasoner lets you build graph representations from your model and run algorithms to uncover structure, measure influence, and extract insights from relationships between entities.

  1. Create a Graph from your RAI model.

    import the graphs module from the relationalai.std package and use the Graph class to create a graph object:

    social_network.py
    import relationalai as rai
    from relationalai.std import graphs
    # Define your model.
    model = rai.Model("SocialNetwork")
    # Declare entity and relationship types.
    Person = model.Type("Person")
    Follows = model.Type("Friends")
    Follows.person1.declare()
    Follows.person2.declare()
    # Define sample data.
    24 collapsed lines
    with model.rule():
    Person.add(name="Alice")
    Person.add(name="Bob")
    Person.add(name="Carlos")
    Person.add(name="Diana")
    Person.add(name="Eve")
    with model.rule():
    person = Person()
    with person.name == "Alice":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Carlos"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    with person.name == "Bob":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Carlos":
    Follows.add(person1=person, person2=Person(name="Alice"))
    with person.name == "Diana":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Eve":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    # Create a graph from the model.
    # NOTE: By default, graphs are directed. Set undirected=True to create an
    # undirected graph.
    graph = graphs.Graph(model)
  2. Define the graph’s nodes.

    Graph objects have a .Node type that represents the nodes in the graph. You can assign entities to this type to use entities from the model as nodes in the graph:

    social_network.py
    import relationalai as rai
    from relationalai.std import graphs
    # Define your model.
    model = rai.Model("SocialNetwork")
    31 collapsed lines
    # Declare entity and relationship types.
    Person = model.Type("Person")
    Follows = model.Type("Friends")
    Follows.person1.declare()
    Follows.person2.declare()
    # Define sample data.
    with model.rule():
    Person.add(name="Alice")
    Person.add(name="Bob")
    Person.add(name="Carlos")
    Person.add(name="Diana")
    Person.add(name="Eve")
    with model.rule():
    person = Person()
    with person.name == "Alice":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Carlos"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    with person.name == "Bob":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Carlos":
    Follows.add(person1=person, person2=Person(name="Alice"))
    with person.name == "Diana":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Eve":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    # Create a graph from the model.
    graph = graphs.Graph(model)
    # Define the graph's nodes.
    with model.rule():
    person = Person()
    person.set(graph.Node) # All Person entities are nodes.
  3. Define the graph’s edges.

    The Graph object has an .Edge type that represents the edges in the graph. Assign nodes to its .from_ and .to properties to define the graph’s edges:

    social_network.py
    import relationalai as rai
    from relationalai.std import graphs
    # Define your model.
    model = rai.Model("SocialNetwork")
    31 collapsed lines
    # Declare entity and relationship types.
    Person = model.Type("Person")
    Follows = model.Type("Friends")
    Follows.person1.declare()
    Follows.person2.declare()
    # Define sample data.
    with model.rule():
    Person.add(name="Alice")
    Person.add(name="Bob")
    Person.add(name="Carlos")
    Person.add(name="Diana")
    Person.add(name="Eve")
    with model.rule():
    person = Person()
    with person.name == "Alice":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Carlos"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    with person.name == "Bob":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Carlos":
    Follows.add(person1=person, person2=Person(name="Alice"))
    with person.name == "Diana":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Eve":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    # Create a graph from the model.
    graph = graphs.Graph(model)
    # Define the graph's nodes.
    with model.rule():
    person = Person()
    person.set(graph.Node) # All Person entities are nodes.
    # Define the graph's edges.
    with model.rule():
    follows = Follows()
    ## Create edges from Follows relationship entities.
    graph.Edge.add(from_=follows.person1, to=follows.person2)
  4. Use graph algorithms to augment your model.

    You can compute various graph algorithms through the Graph objects .compute namespace. For example, you can use the .distance() method to compute the “degree of separation” between two people:

    social_network.py
    import relationalai as rai
    from relationalai.std import graphs
    # Define your model.
    model = rai.Model("SocialNetwork")
    5 collapsed lines
    # Declare entity and relationship types.
    Person = model.Type("Person")
    Follows = model.Type("Friends")
    Follows.person1.declare()
    Follows.person2.declare()
    # Declare a new relationship type.
    DegreesOfSeparation = model.Type("DegreeOfSeparation")
    DegreesOfSeparation.person1.declare()
    DegreesOfSeparation.person2.declare()
    DegreesOfSeparation.distance.declare()
    25 collapsed lines
    # Define sample data.
    with model.rule():
    Person.add(name="Alice")
    Person.add(name="Bob")
    Person.add(name="Carlos")
    Person.add(name="Diana")
    Person.add(name="Eve")
    with model.rule():
    person = Person()
    with person.name == "Alice":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Carlos"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    with person.name == "Bob":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Carlos":
    Follows.add(person1=person, person2=Person(name="Alice"))
    with person.name == "Diana":
    Follows.add(person1=person, person2=Person(name="Alice"))
    Follows.add(person1=person, person2=Person(name="Eve"))
    with person.name == "Eve":
    Follows.add(person1=person, person2=Person(name="Bob"))
    Follows.add(person1=person, person2=Person(name="Diana"))
    # Create a graph from the model.
    graph = graphs.Graph(model)
    # Define the graph's nodes.
    with model.rule():
    person = Person()
    person.set(graph.Node) # All Person entities are nodes.
    # Define the graph's edges.
    with model.rule():
    follows = Follows()
    ## Create edges from Follows relationship entities.
    graph.Edge.add(from_=follows.person1, to=follows.person2)
    # Define DegreesOfSeparation entities using the distance between two people
    # in the graph to define the degrees property.
    with model.rule():
    person1, person2 = Person(), Person()
    sep = DegreesOfSeparation.add(person1=person1, person2=person2)
    sep.set(degrees=graph.compute.distance(person1, person2))

    Insights driven by the graph can then be queried:

    # What's the degree of separation between Bob and Diana?
    with model.query() as select:
    bob = Person(name="Bob")
    diana = Person(name="Diana")
    sep = DegreesOfSeparation(person1=bob, person2=diana)
    response = select(sep.degrees)
    print(response.results)
    # degrees
    # 0 2

Dive deeper into the RelationalAI Graph Reasoner with these guides:

Explore example notebooks that walk through building graphs and applying algorithms with hands-on code.