apoc.meta.nodeTypeProperties
Procedure APOC Core
apoc.meta.nodeTypeProperties()
Signature
apoc.meta.nodeTypeProperties(config = {} :: MAP?) :: (nodeType :: STRING?, nodeLabels :: LIST? OF STRING?, propertyName :: STRING?, propertyTypes :: LIST? OF STRING?, mandatory :: BOOLEAN?, propertyObservations :: INTEGER?, totalObservations :: INTEGER?)
Config parameters
The procedure support the following config parameters:
name | type | default | description |
---|---|---|---|
includeLabels |
List<String> |
[] |
labels to include. Default is to include all labels |
includeRels |
List<String> |
[] |
relationship types to include. Default is to include all relationship types |
excludeLabels |
List<String> |
[] |
labels to exclude. Default is to not exclude any label |
excludeRels |
List<String> |
[] |
relationship types to exclude. Default is to not exclude any relationship type |
sample |
Long |
1000 |
number of nodes to sample per label. See "Sampling" section below. |
maxRels |
Long |
100 |
number of relationships to sample per relationship type |
Sampling
Because the count stores return an incomplete picture of the data, we have to cross check the results with the actual data to filter out false positives.
We use a subset of the data to analyze by specifying the sample
parameter (1000 by default).
Through this parameter, for each label we split data for each node-label into batches of (total / sample) ± rand
where total
is the total number of nodes with that label and rand
is a number between 0
and total / sample / 10
.
So, we pick a percentage of nodes with that label of roughly sample / total * 100
% to check against.
We pick the first node of each batch, and we analyze the properties and the relationships.
name | type | default | description |
---|---|---|---|
labels |
List<String> |
[] |
deprecated, use |
rels |
List<String> |
[] |
deprecated, use |
excludes |
List<String> |
[] |
deprecated, use |
Output parameters
Name | Type |
---|---|
nodeType |
STRING? |
nodeLabels |
LIST? OF STRING? |
propertyName |
STRING? |
propertyTypes |
LIST? OF STRING? |
mandatory |
BOOLEAN? |
propertyObservations |
INTEGER? |
totalObservations |
INTEGER? |
Usage Examples
The examples in this section are based on the following sample graph:
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (TomH:Person {name:'Tom Hanks', born:1956})
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (TheMatrixReloaded:Movie {title:'The Matrix Reloaded', released:2003, tagline:'Free your mind'})
CREATE (TheMatrixRevolutions:Movie {title:'The Matrix Revolutions', released:2003, tagline:'Everything that has a beginning has an end'})
CREATE (SomethingsGottaGive:Movie {title:"Something's Gotta Give", released:2003})
CREATE (TheDevilsAdvocate:Movie {title:"The Devil's Advocate", released:1997, tagline:'Evil has its winning ways'})
CREATE (YouveGotMail:Movie {title:"You've Got Mail", released:1998, tagline:'At odds in life... in love on-line.'})
CREATE (SleeplessInSeattle:Movie {title:'Sleepless in Seattle', released:1993, tagline:'What if someone you never met, someone you never saw, someone you never knew was the only someone for you?'})
CREATE (ThatThingYouDo:Movie {title:'That Thing You Do', released:1996, tagline:'In every life there comes a time when that thing you dream becomes that thing you do'})
CREATE (CloudAtlas:Movie {title:'Cloud Atlas', released:2012, tagline:'Everything is connected'})
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixReloaded)
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixRevolutions)
CREATE (Keanu)-[:ACTED_IN {roles:['Julian Mercer']}]->(SomethingsGottaGive)
CREATE (Keanu)-[:ACTED_IN {roles:['Kevin Lomax']}]->(TheDevilsAdvocate)
CREATE (TomH)-[:ACTED_IN {roles:['Joe Fox']}]->(YouveGotMail)
CREATE (TomH)-[:ACTED_IN {roles:['Sam Baldwin']}]->(SleeplessInSeattle)
CREATE (TomH)-[:ACTED_IN {roles:['Mr. White']}]->(ThatThingYouDo)
CREATE (TomH)-[:ACTED_IN {roles:['Zachry', 'Dr. Henry Goose', 'Isaac Sachs', 'Dermot Hoggins']}]->(CloudAtlas);
We can return the metadata of the database from a sample of the database contents, by running the following query:
CALL apoc.meta.nodeTypeProperties();
nodeType | nodeLabels | propertyName | propertyTypes | mandatory | propertyObservations | totalObservations |
---|---|---|---|---|---|---|
":`Person`" |
["Person"] |
"name" |
["String"] |
FALSE |
2 |
2 |
":`Person`" |
["Person"] |
"born" |
["Long"] |
FALSE |
2 |
2 |
":`Movie`" |
["Movie"] |
"title" |
["String"] |
FALSE |
9 |
9 |
":`Movie`" |
["Movie"] |
"tagline" |
["String"] |
FALSE |
8 |
9 |
":`Movie`" |
["Movie"] |
"released" |
["Long"] |
FALSE |
9 |
9 |
We can return metadata for a subset of labels by specifying the includeLabels
config parameter.
The following returns the metadata for the Person
label:
CALL apoc.meta.nodeTypeProperties({includeLabels: ["Person"]});
nodeType | nodeLabels | propertyName | propertyTypes | mandatory | propertyObservations | totalObservations |
---|---|---|---|---|---|---|
":`Person`" |
["Person"] |
"name" |
["String"] |
FALSE |
2 |
2 |
":`Person`" |
["Person"] |
"born" |
["Long"] |
FALSE |
2 |
2 |
We can control the sampling rate by specifying the sample
parameter.
The following returns metadata based on sampling up to 3 nodes per label:
CALL apoc.meta.nodeTypeProperties({sample: 3});
nodeType | nodeLabels | propertyName | propertyTypes | mandatory | propertyObservations | totalObservations |
---|---|---|---|---|---|---|
":`Person`" |
["Person"] |
"name" |
["String"] |
FALSE |
2 |
2 |
":`Person`" |
["Person"] |
"born" |
["Long"] |
FALSE |
2 |
2 |
":`Movie`" |
["Movie"] |
"title" |
["String"] |
FALSE |
3 |
3 |
":`Movie`" |
["Movie"] |
"tagline" |
["String"] |
FALSE |
3 |
3 |
":`Movie`" |
["Movie"] |
"released" |
["Long"] |
FALSE |
3 |
3 |