+1 against over engineering and for fulfilling concrete scenarios One can definitely implement cool and 'function-rich' tagging systems satisfying 99% of the usual use cases by using pretty much any db - RDBMS, GraphDBs or even KV store. I have just learned from others in the past, that modeling it via TagEvents is a nice and scalable way to go, no matter whether TE is a graph node, or a row in some table...
One note on the advantage of graph, though - it can become handy, when you want to implement some 'tag governance model'. After a while you will get quite large and messy heap of tags, with not much structure. The usual natural step then is to clean it up by gathering synonyms together and then binding your tags into one or more structured vocabularies, most likely hierarchical - generally speaking to tree structure(s) - like thesauri/taxonomies. Imagine a system with information about all animals where you need the taxonomy of species. Here implementing a tree structure(s) will become much more pain in the Relational DB, while being almost an ideal showcase for the Graph... But this is probably not the case you are solving here anyway... -Josef. -- www.subject.czSent with Sparrow On pátek, 10. června 2011 at 7:33, Max De Marzi Jr. wrote: > Not quite. What I am saying is that it is best to define the > questions you want to answer before picking a solution and building a > model. > > Look at Josef scenarios, a tagging table with fields > [user_id][tag_id][bookmark_id][created_at] gives you tag activity > streams and is not complex at all. > > I found a hybrid solution worked best for me. 90% of my questions > were answered with a table and the other 10% with a simple graph > model. > Be pragmatic and don't limit yourself to having to choose. > > > On Thu, Jun 9, 2011 at 1:49 PM, Aseem Kishore <aseem.kish...@gmail.com> wrote: > > Max, just to be clear, are you basically saying that this problem is best > > solved by a relational db instead of a graph db? > > > > Thanks, > > Aseem > > > > On Wed, Jun 8, 2011 at 11:21 PM, Max De Marzi Jr. > > <maxdema...@gmail.com>wrote: > > > > > Aseem, > > > > > > Which users tagged what? SELECT DISTINCT user_id FROM USER_TAGS WHERE > > > bookmark_id = x > > > Which bookmarks did a user tag? SELECT DISTINCT bookmark_id FROM > > > USER_TAGS WHERE user_id = x > > > Which bookmarks were tagged with x? SELECT DISTINCT bookmark_id FROM > > > USER_TAGS WHERE tag_id = x > > > > > > What question are you trying to answer that you can't get from a > > > relational table? > > > > > > I think it's better to make your model depending on the questions you > > > are trying to answer. > > > > > > I have a similar model (users tagging users) and I needed to answer: > > > Which users have been tagged by me or my network 6 degrees out? > > > What is the tagged distance a user is away from another user? > > > > > > Turns out, all I needed was User nodes with Tagged links. User -> > > > tagged -> User -> tagged -> User > > > Everything else I get from the relational db. > > > > > > When I start to care about which users have been tagged for by me or > > > my network 6 degrees out for this KEYWORD, then I'll create a more > > > complex model: > > > User -> UserKeyword -> tagged -> UserKeyword -> User > > > Keyword ---/ Keyword ---/ > > > > > > Regards, > > > Max > > > > > > On Thu, Jun 9, 2011 at 12:33 AM, Aseem Kishore <aseem.kish...@gmail.com> > > > wrote: > > > > Also forgot to add: now if you want to show all links (globally) for a > > > given > > > > tag, how do you do that? Are you indexing each tag-link (as a key-value > > > > pair) every time a tag is added? Removing from the index every time a > > > > tag > > > is > > > > deleted? > > > > > > > > Thanks, > > > > > > > > Aseem > > > > > > > > On Wed, Jun 8, 2011 at 10:31 PM, Aseem Kishore <aseem.kish...@gmail.com > > > > wrote: > > > > > > > > > I forgot to state this, but a key requirement of tags of course is > > > > > that > > > you > > > > > can apply multiple of them to the same link. > > > > > > > > > > Would you still go that route then? > > > > > > > > > > If you want to delete a link from your bookmarks, it's a matter then > > > > > of > > > > > deleting each tag edge? > > > > > > > > > > Aseem > > > > > > > > > > > > > > > On Wed, Jun 8, 2011 at 10:28 PM, Siddhartha Kasivajhula < > > > > > countvajh...@gmail.com> wrote: > > > > > > > > > > > Couldn't you use edges for "tags" instead of nodes? > > > > > > > > > > > > user1 --tag--> link1 > > > > > > user2 --tag--> link1 > > > > > > user1 --tag--> link2 > > > > > > > > > > > > > > > > > > On Wed, Jun 8, 2011 at 10:23 PM, Aseem Kishore < > > > aseem.kish...@gmail.com > > > > > > > wrote: > > > > > > > > > > > > > Hi guys, > > > > > > > > > > > > > > We're thinking about implementing tags in our system, and we're > > > > > > pondering a > > > > > > > few ideas for how we'd go about it, and none of them seem perfect. > > > I'd > > > > > > like > > > > > > > to ask you guys: how would you design an analogous case: > > > > > > > Del.icio.us > > > ? > > > > > > > > > > > > > > At the core, *users bookmark links*, so it makes sense to have > > > "users" > > > > > > and > > > > > > > "links" as types of nodes, and "bookmark" as the type of edge that > > > > > > connects > > > > > > > them. Now, you can see all the links a given user has bookmarked, > > > > > > > and > > > > > > all > > > > > > > the users that have bookmarked a given link. > > > > > > > > > > > > > > Now users can also *tag* links, of course, but the most > > > > > > > interesting > > > > > > > requirement is that, when I'm looking at *my links*, I only want > > > > > > > to > > > see > > > > > > *my > > > > > > > tags*. Thus, tags can't be tied just to links; they have to be > > > > > > > tied > > > to > > > > > > > users > > > > > > > too. But most importantly, you have to maintain *which* user and > > > *which* > > > > > > > link *each* tag is for. > > > > > > > > > > > > > > Thus, it seems most intuitive to us if we could have "tags" be > > > > > > > nodes > > > > > > > that *point > > > > > > > to the "bookmark" edges*. Unfortunately, that's a hypergraph, > > > > > > > which > > > > > > Neo4j > > > > > > > doesn't support. > > > > > > > > > > > > > > We could use intermediate nodes for bookmarks maybe, but that > > > > > > > sort of > > > > > > sucks > > > > > > > to lose the intuitiveness of the graph and introduce redundant > > > > > > > edges, > > > > > > more > > > > > > > complexity which makes consistency harder, etc. > > > > > > > > > > > > > > We have some other ideas, but I'm curious if any of you guys have > > > > > > thought > > > > > > > about this already or have done it, or if you guys have thoughts. > > > Thanks > > > > > > in > > > > > > > advance! > > > > > > > > > > > > > > Aseem > > > > > > > _______________________________________________ > > > > > > > Neo4j mailing list > > > > > > > User@lists.neo4j.org > > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > > > > > _______________________________________________ > > > > > > Neo4j mailing list > > > > > > User@lists.neo4j.org > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > > > _______________________________________________ > > > > Neo4j mailing list > > > > User@lists.neo4j.org > > > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > > > Neo4j mailing list > > > User@lists.neo4j.org > > > https://lists.neo4j.org/mailman/listinfo/user > > _______________________________________________ > > Neo4j mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ > Neo4j mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user