Writing Models¶
Models look similar to typical Django models. A neo4django model definition might look like this:
from neo4django.db import models
class Person(models.NodeModel):
name = models.StringProperty()
age = models.IntegerProperty()
friends = models.Relationship('self',rel_type='friends_with')
Properties¶
As you can see, some basic properties are provided:
class OnlinePerson(Person):
email = models.EmailProperty()
homepage = models.URLProperty()
Some property types can also be indexed by neo4django. This will speed up subsequent queries based on those properties:
class EmployedPerson(Person):
job_title = models.StringProperty(indexed=True)
All instances of EmployedPerson will have their job_title properties indexed.
For a list of included property types, check out neo4django.db.models.__init__.
Relationships¶
Relationships are simple. Instead of ForeignKey, ManyToManyField, or OneToOneField, just use Relationship. In addition to the relationship target, you can specify a relationship type and direction, cardinality, and the name of the relationship on the target model:
class Pet(models.NodeModel):
owner = models.Relationship(Person,
rel_type='owns',
single=True,
related_name='pets'
)
Note that specifying cardinality with single or related_single is optional- Neo4j doesn’t enforce any relational cardinality. Instead, these options are provided as a modeling convenience.
You can also target a model that has yet to be defined with a string:
class Pet(models.NodeModel):
owner = models.Relationship('Person',
rel_type='owns',
single=True,
related_name='pets'
)
And then in the interpreter:
>>> pete = Person.objects.create(name='Pete', age=30)
>>> garfield = Pet.objects.create()
>>> pete.pets.add(garfield)
>>> pete.save()
>>> list(pete.pets.all())
[<Pet: Pet object>]
If you care about the order of a relationship, add the preserve_ordering=True option. Related objects will be retrieved in the order they were saved.
Got a few models written? To learn about retrieving data, see Querying.