Compute.is_triangle()#
#Compute.is_triangle(node1: Producer, node2: Producer, node3: Producer) -> Expression
Check that three nodes form a triangle in the graph.
node1, node2, and node3 form a triangle if there is an edge from node1 to node2,
from node2 to node3, and from node3 to node1.
Must be called in a rule or query context.
Supported Graph Types#
| Graph Type | Supported | Notes |
|---|---|---|
| Directed | Yes | |
| Undirected | Yes | |
| Weighted | Yes | Weights are ignored. |
| Unweighted | Yes |
Parameters#
| Name | Type | Description |
|---|---|---|
node1 | Producer | A node in the graph. |
node2 | Producer | A node in the graph. |
node3 | Producer | A node in the graph. |
Returns#
Returns an Expression object that produces
True if the node1, node2, and node3 form a triangle, and False otherwise.
Example#
Use .is_triangle() to check if three nodes form a triangle in a graph.
You access the .is_triangle() method from a Graph object’s
.compute attribute:
#import relationalai as rai
from relationalai.std.graphs import Graph
# Create a model named "socialNetwork" with a Person type
model = rai.Model("socialNetwork")
Person = model.Type("Person")
# Add some people to the model and connect them with a multi-valued `follows` property.
with model.rule():
alice = Person.add(name="Alice")
bob = Person.add(name="Bob")
charlie = Person.add(name="Charlie")
diana = Person.add(name="Diana")
alice.follows.add(bob)
bob.follows.add(charlie)
charlie.follows.extend([alice, diana])
# Create a directed graph with Person nodes and edges between followers.
# Note that graphs are directed by Default.
# This graph has edges from Alice to Bob, Bob to Charlie, Charlie to Alice, and Charlie to Diana.
graph = Graph(model)
graph.Node.extend(Person)
graph.Edge.extend(Person.follows)
# Do Alice, Bob, and Charlie form a triangle?
with model.query() as select:
is_triangle = graph.compute.is_triangle(
Person(name="Alice"),
Person(name="Bob"),
Person(name="Charlie")
)
response = select(is_triangle)
print(response.results)
# Output:
# v
# 0 True
# Do Alice, Bob, and Diana form a triangle?
with model.query() as select:
is_triangle = graph.compute.is_triangle(
Person(name="Alice"),
Person(name="Bob"),
Person(name="Diana")
)
response = select(is_triangle)
print(response.results)
# Output:
# v
# 0 False
You can also use .is_triangle() in a rule to filter out nodes that do not form a triangle:
## Find all nodes that form a triangle
with model.query() as select:
# Get triples of Person objects.
person1, person2, person3 = Person(), Person(), Person()
# Filter triples based on whether they form a triangle.
graph.compute.is_triangle(person1, person2, person3)
# Select the names of people that form triangles.
response = select(person1.name, person2.name, person3.name)
print(response.results)
# Output:
# name name2 name3
# 0 Alice Bob Charlie
# 1 Bob Charlie Alice
# 2 Charlie Alice Bob
The output has three rows, but each row is a permutation of the same three nodes.
To get unique triples of nodes that form triangles, use .triangle().