简体   繁体   中英

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.

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

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM