2015-12-07 2 views
0

Я хочу создать граф из коллекции Mongodb. Узлы этого графика должны быть изобретателями патентов, и они должны быть связаны общим идентификатором (который представляет общий патент). Вот код, который я написал, чтобы печатать только узлы.Мне нужно создать социальную сеть, используя Python и Mongodb

from pymongo import MongoClient 
from pymongo import ASCENDING, DESCENDING 
import networkx as nx 
import matplotlib.pyplot as plt 


uri ="mongodb://127.0.0.1:27017/Patent" 
client = MongoClient(uri) 

righe ={1:'CODINV2', 2:'INCY', 3:'INNAME', 4:'INADDR',5:'INADOTH',6:'INCITY',7:'INCOUNTY',8:'INREGION',9:'INSTATE',10:'INZIP',11:'nuts3',12:'alive',13:'APPLN_ID',14:'PROGR'} 
db = client['Patent'] 
collection2 = db['projects'] 
collection = db['myprova'] 

nodi={} 
i=0 
G=nx.Graph() 

k=1 #this parameter represents the fact that an inventor is still alive 

db.projects.aggregate([{"$match": {"$and": [{"alive": k}, {"INCY": "IT"}]}}, {"$group": {"_id": "$CODINV2"}}, {"$out": "myprova"}], allowDiskUse=True) 
inventor = collection.find() 
newList=[] 

for inv in inventor: 
    newList.append(inv) 

print newList 

for idi in newList: 
    nodi[idi] = i 
    G.add_node(i) 
    i += 1 



#print(G.number_of_nodes()) 


nx.draw(G) 

plt.show() 

Атрибут CODINV2 представляет собой идентификатор каждого изобретателя. Выполнение этого кода эти ошибки появляются в консоли:

http://i.stack.imgur.com/BC9wd.png

Как я могу решить эту проблему? Вы знаете другое решение для достижения моей цели? Я новичок в MondoDB и Python

+0

Там нет абсолютно никакой необходимости в скриншоте, скопируйте сообщение об ошибке на ваш первоначальный вопрос и убедитесь, что он показывает dict или даже лучше предоставляет сведения об этом типе. Очевидно, что отсутствует поддержка хэша. – Marged

ответ

0

Из-за ошибки я заключил, что idi - это словарь. Словарь не может быть хэширован и поэтому не может использоваться в качестве ключа к другому словарю. Кажется, что ваш запрос find возвращает набор словарей.

0

Вы пытаетесь сохранить словарь в качестве ключа для другого словаря, и это не разрешено, потому что словарь не является хешируемой. См. below

Клавиши словаря являются почти произвольными значениями. Значения, которые не являются хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы (которые сравниваются по значению, а не по объекту ) не могут использоваться в качестве ключей.

В основном у вас есть

nodi = {} //which is a dictionary 

И ниже код пытается сохранить словарь idi в качестве ключа Nodi

for idi in newList: 
    nodi[idi] = i 

Поскольку idi является словарем (как показано ниже), вы получите сообщение об ошибке

{"uid": xxxxxx} where xxx is numbers 

, если вы замените следующие

nodi[idi] = i 

С

nodi[i] = idi 

Тогда вы не получите сообщение об ошибке, потому что i является hashable (так же, как строка в отличие от списка и словаря).

тогда Вы, возможно, потребуется изменить способ добавить узел в G, так что-то вроде:

G.add_node(nodi[i]) где nodi[i] нет ничего, кроме {"uid": xxxxx}

Смежные вопросы