CREATE¶
The CREATE clause is used to create nodes and relationships in the graph.
Create Nodes¶
Basic Node Creation¶
Node with Properties¶
Multiple Labels¶
Multiple Nodes¶
CREATE (u1:User {name: 'Alice'}),
(u2:User {name: 'Bob'}),
(u3:User {name: 'Charlie'})
RETURN u1, u2, u3
Create Relationships¶
Basic Relationship¶
Relationship with Properties¶
MATCH (a:User {name: 'Alice'}),
(b:User {name: 'Bob'})
CREATE (a)-[:KNOWS {since: '2020-01-15', strength: 0.8}]->(b)
RETURN a, b
Bidirectional Relationships¶
Create Nodes and Relationships Together¶
Create Path¶
Create Complex Pattern¶
CREATE (u:User {name: 'Alice'})-[:POSTED]->(p:Post {title: 'Hello World'}),
(u)-[:LIVES_IN]->(c:City {name: 'New York'})
RETURN u, p, c
Create Chain¶
CREATE (a:User {name: 'Alice'})-[:KNOWS]->(b:User {name: 'Bob'})-[:KNOWS]->(c:User {name: 'Charlie'})
RETURN a, b, c
Create with RETURN¶
Return created elements:
Create from Parameters¶
Use parameters for dynamic data:
Python example:
graph.query("""
CREATE (u:User {name: $name, age: $age})
RETURN u
""", {
'name': 'Alice',
'age': 28
})
Bulk Creation¶
Create Multiple Nodes with UNWIND¶
UNWIND [
{name: 'Alice', age: 28},
{name: 'Bob', age: 32},
{name: 'Charlie', age: 25}
] AS userData
CREATE (u:User {name: userData.name, age: userData.age})
RETURN count(u) AS created
Batch Create from List¶
WITH [
['Alice', 'Bob'],
['Bob', 'Charlie'],
['Alice', 'Charlie']
] AS friendships
UNWIND friendships AS friendship
MATCH (a:User {name: friendship[0]}),
(b:User {name: friendship[1]})
CREATE (a)-[:KNOWS]->(b)
CREATE vs MERGE¶
CREATE always creates new elements:
Use MERGE to avoid duplicates:
Create with Match¶
Create based on existing data:
Set Timestamps on Creation¶
Create Unique IDs¶
Common Patterns¶
Create User Profile¶
CREATE (u:User {name: 'Alice'})-[:HAS_PROFILE]->(p:Profile {
bio: 'Software Engineer',
location: 'San Francisco',
website: 'https://alice.dev'
})
RETURN u, p
Create Social Connection¶
MATCH (a:User {name: 'Alice'}),
(b:User {name: 'Bob'})
CREATE (a)-[r:KNOWS {
since: datetime(),
type: 'friend',
strength: 1.0
}]->(b)
RETURN a, r, b
Create Hierarchical Data¶
CREATE (company:Company {name: 'TechCorp'})
CREATE (dept1:Department {name: 'Engineering'})-[:PART_OF]->(company)
CREATE (dept2:Department {name: 'Sales'})-[:PART_OF]->(company)
CREATE (emp1:Employee {name: 'Alice'})-[:WORKS_IN]->(dept1)
CREATE (emp2:Employee {name: 'Bob'})-[:WORKS_IN]->(dept1)
RETURN company, dept1, dept2, emp1, emp2
Create Time-Series Events¶
UNWIND range(1, 10) AS i
CREATE (e:Event {
id: i,
timestamp: datetime() + duration({days: i}),
type: 'measurement',
value: rand() * 100
})
Performance Tips¶
-
Batch Creates
-
Use Transactions
-
Set Indexes Before Bulk Loads
-
Avoid Creating Duplicates
Error Handling¶
Avoid Constraint Violations¶
-- Create constraint
CREATE CONSTRAINT ON (u:User) ASSERT u.email IS UNIQUE
-- This will fail if email exists
CREATE (u:User {email: 'alice@example.com'})
-- Use MERGE to handle existing data
MERGE (u:User {email: 'alice@example.com'})
ON CREATE SET u.name = 'Alice', u.created = datetime()
Next Steps¶
- Update data with SET
- Delete data with DELETE
- Match patterns with MATCH
- Read Cypher Introduction