Compute.triangle_community()#

relationalai.std.graphs
#Compute.triangle_community(node: Producer) -> Expression

Assign a community label to node using the percolation method. The percolation method identifies communities within a graph by detecting densely connected clusters of nodes. It operates by initially locating all triangles within the graph—groups of three interconnected nodes. The process involves iteratively merging these triangles that share a common edge. This merging continues until no further triangles can be combined, effectively revealing the network’s densely connected communities. Nodes that are not part of any triangles are excluded. This method is only applicable to undirected graphs. Must be called in a rule or query context.

Supported Graph Types#

Graph TypeSupportedNotes
DirectedNoNot applicable.
UndirectedYes
WeightedYesWeights are ignored.
UnweightedYes

Parameters#

NameTypeDescription
nodeProducerA node in the graph.

Returns#

Returns an Expression object that produces the community label of node as an integer value.

Example#

Use .triangle_community() to assign a community label to a node in a graph. You access the .triangle_community() method from a Graph object’s .compute attribute:

#import relationalai as rai
from relationalai.std import alias
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 `friends` 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.friends.add(bob)
    bob.friends.add(charlie)
    charlie.friends.extend([alice, diana])

# Create an undirected graph with Person nodes and edges between followers.
# Note that graphs are directed by default.
graph = Graph(model, undirected=True)
graph.Node.extend(Person)
graph.Edge.extend(Person.friends)

# Find the community label for a single person using the percolation method.
with model.query() as select:
    community = graph.compute.triangle_community(Person(name="Alice"))
    response = select(alias(community, "community_label"))

print(response.results)
# Output:
#    community_label
# 0                1

# Compute the community label for each person in the graph.
with model.query() as select:
    person = Person()
    community = graph.compute.triangle_community(person)
    response = select(person.name, alias(community, "community_label"))

print(response.results)
# Output:
#       name  community_label
# 0    Alice                1
# 1      Bob                1
# 2  Charlie                1

The above graph has edges from Alice to Bob, Bob to Charlie, Charlie to Alice, and Charlie to Diana. Alice, Bob, and Charlie form a triangle, but Diana is not part of any triangles. The percolation method assigns Alice and Bob to the same community. Diana is filtered out because she is not part of any triangles.

Use std.aggregate.count() to count the number of communities identified in the graph:

#from relationalai.std.aggregates import count

with model.query() as select:
    person = Person()
    community = graph.compute.triangle_community(person)
    response = select(alias(count(community), "num_communities"))

print(response.results)
# Output:
#   num_communities
# 0               1

See Also#