开发者

Storing graph-like structure in Couch DB or do include_docs yourself

I am trying to store network layout in Couch DB, but my solution provides rather randomized graph. I store a nodes with a document:

{_id ,
nodeName,
group}

and storing links in traditional:

{_id, source_id, target_id, value}

Following multiple tutorials on handling joins and multiple relationship in Couch DB I created view:

function(doc) {
  if(doc.type == 'connection') {

      if (doc.source_id) 
        emit("source", {'_id': doc.source_id});
      if(doc.target_id)
        emit("target", {'_id': doc.target_id});
    }

} 

which should have emitted sequence of source and target id, then I pass it to the list function with include_docs=true, assumes that source and target come in pairs stitches everything back in a structure like this:

{
  "nodes":[
    {"nodeName":"Name 1","group":"1"},
    {"nodeName":"Name 2","group":"1"},
  ],
  "links": [
    {"source":7,"target":0,"value":1},
    {"source":7,"target":5,"value":1}
  ]
}

Although my list produce a proper JSON, view map returns number of rows of source docs and then target docs. So far I don't have any ideas how to make this thing working properly - I am happy to fetch additional values from document _id in the list, but so far I havn't find any good examples. Alternative ways of achieving the same goal are welcome. _id values are standard for CouchDB so far.

Update: while writing a question I came up with different view which sorted my immediate problem, but I still would like to see other options. updated map:

function(doc) {
  if(doc.type == 'connection') {

      if (doc.source_id) 
        emit([doc._id,0,"source"], {'_id': doc.source_id});
      if(doc.target_id)
        emit([doc._id,1,"target"], {'_id'开发者_开发技巧: doc.target_id});
    }

} 


Your updated map function makes more sense. However, you don't need 0 and 1 in your key since you have already "source"and "target".

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜