user899205
user899205

Reputation:

A simple SQL Select query to crawl all connected people in a social graph?

What is the shortest or fastest SQL select query or SQL procedure to crawl a social graph. Imagine we have this table:

UId FriendId
1   2
2   1
2   4
1   3
5   7
7   5
7   8
5   9
9   7

We have two subset of people here, i'm talking about a sql query or procedure which if we pass:

Uid = 4 return the result set rows with uid : {1, 2, 3}

or if

Uid = 9 return the result set rows with uid : {5, 7, 8}

Sorry for my poor english.

Upvotes: 3

Views: 2695

Answers (3)

Caner
Caner

Reputation: 59168

So you want get all friends of someone, including n-th degree friends? I don't think it is possible without recursion.

How you can do that is explained here: https://inviqa.com/blog/graphs-database-sql-meets-social-network

Upvotes: 4

Cybercartel
Cybercartel

Reputation: 12592

If you are storing your values in an adjacency list, and you want n-th degree you can simply recursively INNER JOIN the UID's. For example:

Select t1.uid, t2.uid, t3.uid FROM t1 INNER JOIN t2 ON t1.uid=t2.uid INNER JOIN t3 ON t2.uid=t3.uid

This query is like a DFS with a fixed depth.

Upvotes: 0

dnagirl
dnagirl

Reputation: 20456

If you are storing your values in an adjacency list, the easiest way I've found to crawl it is to translate it into a graphing language and query that. For example, if you were working in PHP, you could use the Image_GraphViz package. Or, if you want to use AJAX, you might consider cytoscapeweb. Both work well.

In either case, you'd SELECT * FROM mytable and feed all the records into the graph package as nodes. This means outputting them in dot or GraphML (or other graphing language). Then you can easily query them.

If you don't wish to translate the dataset, consider storing it as nested sets. Nested sets, though a bit of a pain to maintain, are much better than adjacency lists for the kind of queries you are looking to do.

Upvotes: 1

Related Questions