diff --git a/pages/querying/schema.mdx b/pages/querying/schema.mdx index 88a99cf15..5c0c30f53 100644 --- a/pages/querying/schema.mdx +++ b/pages/querying/schema.mdx @@ -376,9 +376,11 @@ This procedure is also exposed as `apoc.meta.nodeTypeProperties` and - `nodeType: string` ➡ Concatenated node labels separated by a `:`. - `nodeLabels: List[string]` ➡ A list of node labels. +- `propertyName: string` ➡ Property name. +- `propertyTypes: List[string]` ➡ Property types observed for this property on nodes of this type. - `mandatory: boolean` ➡ Returns `True` if every node with a given node type (defined by nodeType or nodeLabels) possesses the listed property (propertyName), and `False` otherwise. -- `propertyName: string` ➡ Property name. -- `propertyTypes: string` ➡ Property type. +- `propertyObservations: integer` ➡ Number of nodes of this type that carried this property. +- `totalObservations: integer` ➡ Total number of nodes of this type that were examined (bounded by the `sample` config option). {

Usage:

} @@ -386,14 +388,14 @@ To get the information about nodes and properties, run the following query: ```cypher CALL schema.node_type_properties() -YIELD nodeType, nodeLabels, mandatory, propertyName, propertyTypes; +YIELD nodeType, nodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` To restrict the scan to a subset of labels, pass a `config` map: ```cypher CALL schema.node_type_properties({includeLabels: ["Dog"]}) -YIELD nodeType, nodeLabels, mandatory, propertyName, propertyTypes; +YIELD nodeType, nodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` ### rel_type_properties() @@ -423,9 +425,15 @@ This procedure is also exposed as `apoc.meta.relTypeProperties` and {

Output:

} - `relType: string` ➡ The type of the relationship. -- `mandatory: boolean` ➡ Returns `True` if every relationship with a given relationship type (defined by relType) possesses the listed property (propertyName), and `False` otherwise. +- `sourceNodeLabels: List[string]` ➡ Labels on the start node of relationships in this partition. +- `targetNodeLabels: List[string]` ➡ Labels on the end node of relationships in this partition. - `propertyName: string` ➡ Property name. -- `propertyTypes: string` ➡ Property type. +- `propertyTypes: List[string]` ➡ Property types observed for this property on relationships in this partition. +- `mandatory: boolean` ➡ Returns `True` if every relationship in this partition possesses the listed property, and `False` otherwise. +- `propertyObservations: integer` ➡ Number of relationships in this partition that carried this property. +- `totalObservations: integer` ➡ Total number of relationships in this partition that were examined. + +One row is emitted per `(relType, sourceNodeLabels, targetNodeLabels, propertyName)` combination. The same relationship type connecting different label sets (for example `(:Dog)-[:LOVES]->(:Activity)` vs `(:Cat)-[:LOVES]->(:Place)`) produces separate rows, so each partition can be characterised independently. {

Usage:

} @@ -434,14 +442,14 @@ To get the information about relationships and properties, run the following que ```cypher CALL schema.rel_type_properties() -YIELD relType, mandatory, propertyName, propertyTypes; +YIELD relType, sourceNodeLabels, targetNodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` To restrict the scan to a subset of relationship types, pass a `config` map: ```cypher CALL schema.rel_type_properties({includeRels: ["LOVES"]}) -YIELD relType, mandatory, propertyName, propertyTypes; +YIELD relType, sourceNodeLabels, targetNodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` ### assert() @@ -517,7 +525,7 @@ Results: +-----------------------------------------------------------------------------+ | "Created" | "[name, surname]" | ["name", "surname"] | "Person" | true | +-----------------------------------------------------------------------------+ -| "Kept" | "id" | ["id"] | "Person" | true | +| "Kept" | "[id]" | ["id"] | "Person" | true | +-----------------------------------------------------------------------------+ ``` @@ -555,41 +563,45 @@ Call the procedure to get information about the nodes: ```cypher CALL schema.node_type_properties() -YIELD nodeType, nodeLabels, mandatory, propertyName, propertyTypes; +YIELD nodeType, nodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` Result: ```plaintext -+--------------------+--------------------+--------------------+--------------------+--------------------+ -| nodeType | nodeLabels | mandatory | propertyName | propertyTypes | -+--------------------+--------------------+--------------------+--------------------+--------------------+ -| ":`Sky`" | ["Sky"] | false | "" | "" | -| ":`Park`" | ["Park"] | false | "" | "" | -| ":`Human`:`Owner`" | ["Human", "Owner"] | false | "age" | "Int" | -| ":`Human`:`Owner`" | ["Human", "Owner"] | false | "name" | "String" | -| ":`Bird`" | ["Bird"] | false | "" | "" | -| ":`Dog`" | ["Dog"] | false | "age" | "Int" | -| ":`Dog`" | ["Dog"] | false | "name" | "String" | -+--------------------+--------------------+--------------------+--------------------+--------------------+ ++--------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ +| nodeType | nodeLabels | propertyName | propertyTypes | mandatory | propertyObservations | totalObservations | ++--------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ +| ":`Bird`" | ["Bird"] | "" | [] | false | 0 | 1 | +| ":`Dog`" | ["Dog"] | "age" | ["Int"] | false | 1 | 2 | +| ":`Dog`" | ["Dog"] | "name" | ["String"] | false | 1 | 2 | +| ":`Human`:`Owner`" | ["Human", "Owner"] | "age" | ["Int"] | true | 1 | 1 | +| ":`Human`:`Owner`" | ["Human", "Owner"] | "name" | ["String"] | true | 1 | 1 | +| ":`Park`" | ["Park"] | "" | [] | false | 0 | 1 | +| ":`Sky`" | ["Sky"] | "" | [] | false | 0 | 1 | ++--------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ ``` +Of the two `:Dog` nodes, only one carries `name` and `age` — hence `propertyObservations = 1`, `totalObservations = 2`, and `mandatory = false`. The single `:Human:Owner` node has both properties, so they are marked mandatory. + Call the procedure to get information about the relationships: ```cypher CALL schema.rel_type_properties() -YIELD relType, mandatory, propertyName, propertyTypes; +YIELD relType, sourceNodeLabels, targetNodeLabels, propertyName, propertyTypes, mandatory, propertyObservations, totalObservations; ``` Results: ```plaintext -+------------------------+------------------------+------------------------+------------------------+ -| relType | mandatory | propertyName | propertyTypes | -+------------------------+------------------------+------------------------+------------------------+ -| ":`FLIES_TO`" | false | "" | "" | -| ":`RUNS_AND_PLAYS_IN`" | false | "duration" | "String" | -| ":`RUNS_AND_PLAYS_IN`" | false | "speed" | "Int" | -| ":`LOVES`" | true | "how_much" | "String" | -+------------------------+------------------------+------------------------+------------------------+ ++------------------------+------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ +| relType | sourceNodeLabels | targetNodeLabels | propertyName | propertyTypes | mandatory | propertyObservations | totalObservations | ++------------------------+------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ +| ":`FLIES_TO`" | ["Bird"] | ["Sky"] | "" | [] | false | 0 | 1 | +| ":`LOVES`" | ["Dog"] | ["Human", "Owner"] | "how_much" | ["String"] | true | 1 | 1 | +| ":`RUNS_AND_PLAYS_IN`" | ["Dog"] | ["Park"] | "duration" | ["String"] | true | 1 | 1 | +| ":`RUNS_AND_PLAYS_IN`" | ["Dog"] | ["Park"] | "speed" | ["Int"] | true | 1 | 1 | ++------------------------+------------------+--------------------+--------------+----------------+-----------+----------------------+--------------------+ ``` + +Each row is keyed by the relationship type *together with* the labels on the start and end nodes. If the dataset had another `:LOVES` relationship between different label sets (for example `(:Cat)-[:LOVES]->(:Activity)`), it would appear on its own row rather than being merged into the existing `:LOVES` partition.