How can I model this problem in a graph database?
How can I model this in a graph database like Neo4j?


Modeling neo4j graphs from relational data is quite simple:


Decide your vertexes (nodes, objects) and edges (relationships). 
Convert relational data to cypher, declaring all items and all relationships explicit.


Note: Mapping from relational to graph could take only selected entities from relational model, and single table rows can explode into multiple vertexes and multiple edges.


  Is this the right way to structure this data in a graph database?


Yes, it looks OK. Assuming that file, author, company, user, and image are nodes, and date is only an attribute, this 

file: 11425646.pdf
  author: bob
  company: abc co
  date: 1/1/2011
  mentioned_users: [alice,sue,mike,sally]
  images: [1958.jpg,535.jpg,35735.jpg]


should convert to this

MERGE (f :File {name:'11425646.pdf', date:'1/1/2011'})
MERGE (a :Author {name:'bob'})
MERGE (c :Company {name:'abc co'})
MERGE (u1 :User {name:'alice'})
MERGE (u2 :User {name:'sue'})
MERGE (u3 :User {name:'mike'})
MERGE (u4 :User {name:'sally'})
MERGE (i1 :Image {name:'1958.jpg'})
MERGE (i2 :Image {name:'535.jpg'})
MERGE (i3 :Image {name:'35735.jpg'})
MERGE (f)-[:WRITTEN_BY]-&gt;(a)
MERGE (f)-[:FROM_COMPANY]-&gt;(c)
MERGE (f)-[:MENTIONS]-&gt;(u1)
MERGE (f)-[:MENTIONS]-&gt;(u2)
MERGE (f)-[:MENTIONS]-&gt;(u3)
MERGE (f)-[:MENTIONS]-&gt;(u4)
MERGE (f)-[:HAS_IMAGE]-&gt;(i1)
MERGE (f)-[:HAS_IMAGE]-&gt;(i2)
MERGE (f)-[:HAS_IMAGE]-&gt;(i3)


Useful links: data modeling guide and  Cypher reference