diff --git a/dev/neo4j.yaml b/dev/neo4j.yaml index 08930cf1..9b21edff 100644 --- a/dev/neo4j.yaml +++ b/dev/neo4j.yaml @@ -1,7 +1,7 @@ name: cocoindex-neo4j services: neo4j: - image: neo4j:latest + image: neo4j:5-enterprise volumes: - /$HOME/neo4j/logs:/logs - /$HOME/neo4j/config:/config @@ -10,6 +10,15 @@ services: environment: - NEO4J_AUTH=neo4j/cocoindex - NEO4J_PLUGINS='["graph-data-science"]' + - NEO4J_ACCEPT_LICENSE_AGREEMENT=eval + + # Uncomment to enable query logging + # - NEO4J_db_logs_query_enabled=VERBOSE + # - NEO4J_db_logs_query_transaction_enabled=VERBOSE + # - NEO4J_db_logs_query_parameter__logging__enabled=true + # - NEO4J_dbms_logs_http_enabled=true + # - NEO4J_server_logs_debug_enabled=true + ports: - "7474:7474" - "7687:7687" diff --git a/src/ops/storages/neo4j.rs b/src/ops/storages/neo4j.rs index 76846fdc..19c427d3 100644 --- a/src/ops/storages/neo4j.rs +++ b/src/ops/storages/neo4j.rs @@ -696,12 +696,14 @@ impl RelationshipSetupState { ) })?; for (label, node) in rel_spec.nodes.iter().flatten() { - sub_components.push(ComponentState { - object_label: ElementType::Node(label.clone()), - index_def: IndexDef::KeyConstraint { - field_names: key_field_names.clone(), - }, - }); + if let Some(primary_key_fields) = &node.index_options.primary_key_fields { + sub_components.push(ComponentState { + object_label: ElementType::Node(label.clone()), + index_def: IndexDef::KeyConstraint { + field_names: primary_key_fields.clone(), + }, + }); + } for index_def in &node.index_options.vector_indexes { sub_components.push(ComponentState { object_label: ElementType::Node(label.clone()), @@ -885,8 +887,12 @@ impl components::Operator for SetupComponentOperator { let matcher = state.object_label.matcher(qualifier); let query = neo4rs::query(&match &state.index_def { IndexDef::KeyConstraint { field_names } => { + let key_type = match &state.object_label { + ElementType::Node(_) => "NODE", + ElementType::Relationship(_) => "RELATIONSHIP", + }; format!( - "CREATE CONSTRAINT {name} IF NOT EXISTS FOR {matcher} REQUIRE {field_names} IS UNIQUE", + "CREATE CONSTRAINT {name} IF NOT EXISTS FOR {matcher} REQUIRE {field_names} IS {key_type} KEY", name=key.name, field_names=build_composite_field_names(qualifier, &field_names), )