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

Reply via email to