簡體   English   中英

帶圖約簡的算法圖

[英]Algorithm graph with map reduce

我正在尋找一種從圖形中實現算法的方法,該圖形可為每個用戶返回與其度數為X的用戶列表。

該圖由一個文件表示,該文件包含在已連接用戶對的每一行中(連接在2方向上)。

例如 :

davidbowie  omid
davidbowie  kim
kim torsten
torsten omid
brendan torsten
ziggy   davidbowie
mick    ziggy

對於1度,這里必須具有以下輸出:

torsten brendan kim omid
brendan torsten
ziggy   davidbowie  mick
mick    ziggy
kim davidbowie  torsten
omid    davidbowie  torsten
davidbowie  kim omid    ziggy

每行包含一個用戶和與他連接1度的用戶列表。

要使用python運行MapReduce函數,只需在以下步驟將mapper和reducer寫入單獨的文件中:

cat data.csv |  python mapper.py | sort -k1,1 | python reducer.py

我是hadoop的新手,我的問題是應該在mapper.pyreducer.py寫什么?

我不確定您是否會接受未明確使用MapReduce的答案,但我想提供此答案,因為它確實可以識別二級關系,而且非常簡單並且可以擴展。

假設您正在運行Neo4j數據庫,則可以創建圖:

關系圖

...通過運行以下代碼:

from py2neo import Graph

people_pair_text = """\
davidbowie  omid
davidbowie  kim
kim torsten
torsten omid
brendan torsten
ziggy   davidbowie
mick    ziggy"""

people = set(people_pair_text.split())

graph = Graph()

for person in people:
    query = """CREATE (n:Person {{ name : '{0}'}})""".format(person)
    graph.cypher.execute(query)

for pair in people_pair_text.split("\n"):
    person_a, person_b = pair.split()
    query = """
    MATCH (a:Person),(b:Person)
    WHERE a.name = '{0}' AND b.name = '{1}'
    CREATE (a)-[:KNOWS]->(b)
    CREATE (b)-[:KNOWS]->(a)
    """.format(person_a, person_b)
    graph.cypher.execute(query)

然后,要獲得給定用戶的二級連接(例如'omid'),可以運行如下密碼查詢:

MATCH (omid:Person {name:"omid"})-[:KNOWS*2]-some_connection
WHERE some_connection <> omid
RETURN DISTINCT some_connection

查詢返回:

+-------------------------+
| some_connection         |
+-------------------------+
| Node[1]{name:"brendan"} |
| Node[4]{name:"kim"}     |
| Node[2]{name:"ziggy"}   |
+-------------------------+

Cypher查詢中的*2表示離開的關系數(即“跳數”),因此如果您想返回更遠的連接,則可以更改此關系數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM