图数据库
Nebula Graph
使用 Docker Compose 部署 NebulaGraph
https://github.com/vesoft-inc/nebula-docker-compose.git
https://github.com/vesoft-inc/nebula-docker-compose/blob/release-3.8/docker-compose-lite.yaml
version: '3.4'
services:
metad0:
image: docker.io/vesoft/nebula-metad:v3.8.0
environment:
USER: root
command:
- --meta_server_addrs=metad0:9559
- --local_ip=metad0
- --ws_ip=metad0
- --port=9559
- --ws_http_port=19559
- --data_path=/data/meta
- --log_dir=/logs
- --v=0
- --minloglevel=0
healthcheck:
test: ["CMD", "curl", "-sf", "http://metad0:19559/status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9559:9559
- 19559:19559
- 19560
volumes:
- ./data/meta0:/data/meta
- ./logs/meta0:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE
storaged0:
image: docker.io/vesoft/nebula-storaged:v3.8.0
environment:
USER: root
TZ: "${TZ}"
command:
- --meta_server_addrs=metad0:9559
- --local_ip=storaged0
- --ws_ip=storaged0
- --port=9779
- --ws_http_port=19779
- --data_path=/data/storage
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- metad0
healthcheck:
test: ["CMD", "curl", "-sf", "http://storaged0:19779/status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9779:9779
- 19779:19779
- 19780
volumes:
- ./data/storage0:/data/storage
- ./logs/storage0:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE
graphd:
image: docker.io/vesoft/nebula-graphd:v3.8.0
environment:
USER: root
TZ: "${TZ}"
command:
- --meta_server_addrs=metad0:9559
- --port=9669
- --local_ip=graphd
- --ws_ip=graphd
- --ws_http_port=19669
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- storaged0
healthcheck:
test: ["CMD", "curl", "-sf", "http://graphd:19669/status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9669:9669
- 19669:19669
- 19670
volumes:
- ./logs/graph:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE
networks:
nebula-net:连接 NebulaGraph
Neo4j
https://github.com/neo4j/neo4j
https://neo4j.com/docs/operations-manual/current/tutorial/tutorial-clustering-docker/
CREATE CONSTRAINT movie_title IF NOT EXISTS FOR (m:Movie) REQUIRE m.title IS UNIQUE;
CREATE CONSTRAINT person_name IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE;创建一个没有属性的节点
CREATE (<node-name>:<label-name>)CQL创建具有属性的节点
CREATE (
<node-name>:<label-name>
{
<key>:<Value>
........
<n-key>:<n-Value>
}
)CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })创建多个标签到节点
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)CREATE (m:Movie:Cinema:Film:Picture)CREATE (e:Employee)-[r:DemoRelation]->(c:Employee)节点(Nodes)
关系(Relationships)
属性(Properties)
标签(Labels) 数据类型,对节点归类
MATCH (n:Person) DETACH DELETE n;
MATCH (n:Application) DETACH DELETE n;
MATCH (n:Department) DETACH DELETE n;
MATCH (n:Skill) DETACH DELETE n;
//清空所有数据
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
// 查看所有
MATCH (n)-[r]->(m)
RETURN n, r, mMATCH (p:Person)-[r:BELONGS_TO]->(d:Department)
RETURN p, r, d;
MATCH p=()-[r:BELONGS_TO]->() RETURN p LIMIT 25
MATCH (a)-[r:BELONGS_TO]->(b)
RETURN DISTINCT labels(a) AS startLabels, labels(b) AS endLabels;//查看所有node
CALL db.labels();
//所有关系
CALL db.relationshipTypes();创建唯一约束
// 人员:工号唯一
CREATE CONSTRAINT person_employeeId_unique FOR (p:Person) REQUIRE p.employeeId IS UNIQUE;
// 部门:名称唯一
CREATE CONSTRAINT department_name_unique FOR (d:Department) REQUIRE d.name IS UNIQUE;
// 应用:ID唯一
CREATE CONSTRAINT application_id_unique FOR (a:Application) REQUIRE a.id IS UNIQUE;
// 技能:名称唯一
CREATE CONSTRAINT skill_name_unique FOR (s:Skill) REQUIRE s.name IS UNIQUE;
// 业务能力:名称唯一
CREATE CONSTRAINT bc_name_unique FOR (bc:BusinessCapability) REQUIRE bc.name IS UNIQUE;// 创建人员
CREATE (p1:Person {name:"崔亚丽", employeeId:"1044224"})
CREATE (p2:Person {name:"张志勤", employeeId:"1014408"})
CREATE (d1:Department {name:"出行环境保障组"})
CREATE (d2:Department {name:"创新营销系统组"})
CREATE (p1)-[:BELONGS_TO]->(d1),
(p2)-[:BELONGS_TO]->(d2);这是因为 Neo4j 数据库对 Application 节点的 id 属性设置了唯一性约束。问题是 MERGE 语句在匹配时使用了所有属性,导致即使 id 相同但其他属性不同时会尝试创建新节点而违反约束。
我需要修改代码,让 MERGE 只基于 id 进行匹配,然后用 SET 更新其他属性: