Create a database using a property graph.
Explore further
For detailed documentation that includes this code sample, see the following:
Code sample
C++
To learn how to install and use the client library for Spanner, see Spanner client libraries .
To authenticate to Spanner, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
void
CreateDatabaseWithPropertyGraph
(
google
::
cloud
::
spanner_admin
::
DatabaseAdminClient
client
,
std
::
string
const
&
project_id
,
std
::
string
const
&
instance_id
,
std
::
string
const
&
database_id
)
{
google
::
cloud
::
spanner
::
Database
database
(
project_id
,
instance_id
,
database_id
);
google
::
spanner
::
admin
::
database
::
v1
::
CreateDatabaseRequest
request
;
request
.
set_parent
(
database
.
instance
().
FullName
());
request
.
set_create_statement
(
"CREATE DATABASE `"
+
database
.
database_id
()
+
"`"
);
request
.
add_extra_statements
(
R
"
""(
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id)
)""
"
);
request
.
add_extra_statements
(
R
"
""(
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id)
)""
"
);
request
.
add_extra_statements
(
R
"
""(
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id)
REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person ON DELETE CASCADE
)""
"
);
request
.
add_extra_statements
(
R
"
""(
CREATE TABLE AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING(MAX),
FOREIGN KEY (to_id) REFERENCES Account (id)
) PRIMARY KEY (id, to_id, create_time),
INTERLEAVE IN PARENT Account ON DELETE CASCADE
)""
"
);
request
.
add_extra_statements
(
R
"
""(
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (Account, Person)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY(id) REFERENCES Person(id)
DESTINATION KEY(account_id) REFERENCES Account(id)
LABEL Owns,
AccountTransferAccount
SOURCE KEY(id) REFERENCES Account(id)
DESTINATION KEY(to_id) REFERENCES Account(id)
LABEL Transfers)
)""
"
);
auto
db
=
client
.
CreateDatabase
(
request
).
get
();
if
(
!
db
)
throw
std
::
move
(
db
).
status
();
std
::
cout
<<
"Database "
<<
db
-
> name
()
<<
" created with property graph.
\n
"
;
}
Go
To learn how to install and use the client library for Spanner, see Spanner client libraries .
To authenticate to Spanner, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
import
(
"context"
"fmt"
"io"
"regexp"
database
"cloud.google.com/go/spanner/admin/database/apiv1"
adminpb
"google.golang.org/genproto/googleapis/spanner/admin/database/v1"
)
func
createDatabaseWithPropertyGraph
(
ctx
context
.
Context
,
w
io
.
Writer
,
dbId
string
)
error
{
// dbId is of the form:
// projects/YOUR_PROJECT_ID/instances/YOUR_INSTANCE_ID/databases/YOUR_DATABASE_NAME
matches
:=
regexp
.
MustCompile
(
"^(.*)/databases/(.*)$"
).
FindStringSubmatch
(
dbId
)
if
matches
==
nil
||
len
(
matches
)
!=
3
{
return
fmt
.
Errorf
(
"Invalid database id %s"
,
dbId
)
}
adminClient
,
err
:=
database
.
NewDatabaseAdminClient
(
ctx
)
if
err
!=
nil
{
return
err
}
defer
adminClient
.
Close
()
var
instance
=
matches
[
1
]
var
dbName
=
matches
[
2
]
// The schema defintion for a database with a property graph comprises table
// definitions one or more `CREATE PROPERTY GRAPH` statements to define the
// property graph(s).
//
// Here, tables are created for 'Person's and 'Account's. The property graph
// definition says that these entities form nodes in the graph. Similarly,
// there are 'PersonOwnAccount' and 'AccountTransferAccount' relationship
// tables defined. The property graph definition maps these to edges in the graph.
var
schema_statements
=
[]
string
{
`CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id)`
,
`CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id)`
,
`CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id)
REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person ON DELETE CASCADE`
,
`CREATE TABLE AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING(MAX),
FOREIGN KEY (to_id) REFERENCES Account (id)
) PRIMARY KEY (id, to_id, create_time),
INTERLEAVE IN PARENT Account ON DELETE CASCADE`
,
`CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (Account, Person)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY(id) REFERENCES Person(id)
DESTINATION KEY(account_id) REFERENCES Account(id)
LABEL Owns,
AccountTransferAccount
SOURCE KEY(id) REFERENCES Account(id)
DESTINATION KEY(to_id) REFERENCES Account(id)
LABEL Transfers)`
,
}
op
,
err
:=
adminClient
.
CreateDatabase
(
ctx
,
& adminpb
.
CreateDatabaseRequest
{
Parent
:
instance
,
CreateStatement
:
"CREATE DATABASE `"
+
dbName
+
"`"
,
ExtraStatements
:
schema_statements
,
})
if
err
!=
nil
{
return
err
}
if
_
,
err
:=
op
.
Wait
(
ctx
);
err
!=
nil
{
return
err
}
fmt
.
Fprintf
(
w
,
"Created database [%s]\n"
,
dbId
)
return
nil
}
Java
To learn how to install and use the client library for Spanner, see Spanner client libraries .
To authenticate to Spanner, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
static
void
createDatabaseWithPropertyGraph
(
DatabaseAdminClient
dbAdminClient
,
InstanceName
instanceName
,
String
databaseId
)
{
CreateDatabaseRequest
createDatabaseRequest
=
CreateDatabaseRequest
.
newBuilder
()
.
setCreateStatement
(
"CREATE DATABASE `"
+
databaseId
+
"`"
)
.
setParent
(
instanceName
.
toString
())
.
addAllExtraStatements
(
Arrays
.
asList
(
"CREATE TABLE Person ("
+
" id INT64 NOT NULL,"
+
" name STRING(MAX),"
+
" birthday TIMESTAMP,"
+
" country STRING(MAX),"
+
" city STRING(MAX),"
+
") PRIMARY KEY (id)"
,
"CREATE TABLE Account ("
+
" id INT64 NOT NULL,"
+
" create_time TIMESTAMP,"
+
" is_blocked BOOL,"
+
" nick_name STRING(MAX),"
+
") PRIMARY KEY (id)"
,
"CREATE TABLE PersonOwnAccount ("
+
" id INT64 NOT NULL,"
+
" account_id INT64 NOT NULL,"
+
" create_time TIMESTAMP,"
+
" FOREIGN KEY (account_id)"
+
" REFERENCES Account (id)"
+
") PRIMARY KEY (id, account_id),"
+
"INTERLEAVE IN PARENT Person ON DELETE CASCADE"
,
"CREATE TABLE AccountTransferAccount ("
+
" id INT64 NOT NULL,"
+
" to_id INT64 NOT NULL,"
+
" amount FLOAT64,"
+
" create_time TIMESTAMP NOT NULL,"
+
" order_number STRING(MAX),"
+
" FOREIGN KEY (to_id) REFERENCES Account (id)"
+
") PRIMARY KEY (id, to_id, create_time),"
+
"INTERLEAVE IN PARENT Account ON DELETE CASCADE"
,
"CREATE OR REPLACE PROPERTY GRAPH FinGraph "
+
"NODE TABLES (Account, Person)"
+
"EDGE TABLES ("
+
" PersonOwnAccount"
+
" SOURCE KEY(id) REFERENCES Person(id)"
+
" DESTINATION KEY(account_id) REFERENCES Account(id)"
+
" LABEL Owns,"
+
" AccountTransferAccount"
+
" SOURCE KEY(id) REFERENCES Account(id)"
+
" DESTINATION KEY(to_id) REFERENCES Account(id)"
+
" LABEL Transfers)"
))
.
build
();
try
{
// Initiate the request which returns an OperationFuture.
com
.
google
.
spanner
.
admin
.
database
.
v1
.
Database
db
=
dbAdminClient
.
createDatabaseAsync
(
createDatabaseRequest
).
get
();
System
.
out
.
println
(
"Created database ["
+
db
.
getName
()
+
"]"
);
}
catch
(
ExecutionException
e
)
{
// If the operation failed during execution, expose the cause.
System
.
out
.
println
(
"Encountered exception"
+
e
.
getCause
());
throw
(
SpannerException
)
e
.
getCause
();
}
catch
(
InterruptedException
e
)
{
// Throw when a thread is waiting, sleeping, or otherwise occupied,
// and the thread is interrupted, either before or during the activity.
throw
SpannerExceptionFactory
.
propagateInterrupt
(
e
);
}
}
Python
To learn how to install and use the client library for Spanner, see Spanner client libraries .
To authenticate to Spanner, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
def
create_database_with_property_graph
(
instance_id
,
database_id
):
"""Creates a database, tables and a property graph for sample data."""
from
google.cloud.spanner_admin_database_v1.types
import
spanner_database_admin
spanner_client
=
spanner
.
Client
()
database_admin_api
=
spanner_client
.
database_admin_api
request
=
spanner_database_admin
.
CreateDatabaseRequest
(
parent
=
database_admin_api
.
instance_path
(
spanner_client
.
project
,
instance_id
),
create_statement
=
f
"CREATE DATABASE `
{
database_id
}
`"
,
extra_statements
=
[
"""CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id)"""
,
"""CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id)"""
,
"""CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id)
REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person ON DELETE CASCADE"""
,
"""CREATE TABLE AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING(MAX),
FOREIGN KEY (to_id) REFERENCES Account (id)
) PRIMARY KEY (id, to_id, create_time),
INTERLEAVE IN PARENT Account ON DELETE CASCADE"""
,
"""CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (Account, Person)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY(id) REFERENCES Person(id)
DESTINATION KEY(account_id) REFERENCES Account(id)
LABEL Owns,
AccountTransferAccount
SOURCE KEY(id) REFERENCES Account(id)
DESTINATION KEY(to_id) REFERENCES Account(id)
LABEL Transfers)"""
,
],
)
operation
=
database_admin_api
.
create_database
(
request
=
request
)
print
(
"Waiting for operation to complete..."
)
database
=
operation
.
result
(
OPERATION_TIMEOUT_SECONDS
)
print
(
"Created database
{}
on instance
{}
"
.
format
(
database
.
name
,
database_admin_api
.
instance_path
(
spanner_client
.
project
,
instance_id
),
)
)
What's next
To search and filter code samples for other Google Cloud products, see the Google Cloud sample browser .