Skip to content

Commit 763800d

Browse files
committed
Tune cypher queries for external dependencies
1 parent 993edec commit 763800d

12 files changed

+105
-73
lines changed

cypher/CYPHER.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,26 @@ Script | Directory | Description
7070
| [Count_nodes_and_relationships.cypher](./Count_nodes_and_relationships.cypher) | | Count nodes and relationships |
7171
| [Create_a_DEPENDS_ON_relationship_for_every_DEPENDS_ON_ARTIFACT.cypher](./Create_a_DEPENDS_ON_relationship_for_every_DEPENDS_ON_ARTIFACT.cypher) | | Create a DEPENDS_ON relationship for every DEPENDS_ON_ARTIFACT |
7272
| [Create_a_DEPENDS_ON_relationship_for_every_DEPENDS_ON_PACKAGE.cypher](./Create_a_DEPENDS_ON_relationship_for_every_DEPENDS_ON_PACKAGE.cypher) | | Create a DEPENDS_ON relationship for every DEPENDS_ON_PACKAGE |
73-
| [Create_index_for_full_qualified_type_name.cypher](./Create_index_for_full_qualified_type_name.cypher) | | Create index for full qualified type name |
73+
| [Create_index_for_full_qualified_type_name.cypher](./Create_index_for_full_qualified_type_name.cypher) | | Create index for the full qualified type name |
7474
| [Cyclic_Dependencies.cypher](./Cyclic_Dependencies/Cyclic_Dependencies.cypher) | Cyclic_Dependencies | Cyclic Dependencies |
7575
| [Cyclic_Dependencies_Concatenated.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_Concatenated.cypher) | Cyclic_Dependencies | Cyclic Dependencies Concatenated |
7676
| [Cyclic_Dependencies_as_List.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_as_List.cypher) | Cyclic_Dependencies | Cyclic Dependencies as List |
7777
| [Cyclic_Dependencies_as_unwinded_List.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_as_unwinded_List.cypher) | Cyclic_Dependencies | Cyclic Dependencies as unwinded List |
7878
| [Cyclic_Dependencies_between_Artrifacts_as_unwinded_List.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_between_Artrifacts_as_unwinded_List.cypher) | Cyclic_Dependencies | Cyclic Dependencies between Artifacts as unwinded List |
7979
| [Export_the_whole_database_as_CSV.cypher](./Export_the_whole_database_as_CSV.cypher) | | Export the whole database as CSV |
80-
| [External_package_usage_overall.cypher](./External_Dependencies/External_package_usage_overall.cypher) | External_Dependencies | External package usage overall |
81-
| [External_package_usage_per_artifact.cypher](./External_Dependencies/External_package_usage_per_artifact.cypher) | External_Dependencies | External package usage per artifact |
80+
| [External_package_usage_overall.cypher](./External_Dependencies/External_package_usage_overall.cypher) | External_Dependencies | External package usage overall tuned |
81+
| [External_package_usage_per_artifact.cypher](./External_Dependencies/External_package_usage_per_artifact.cypher) | External_Dependencies | External package usage per artifact tuned |
8282
| [External_package_usage_per_artifact_and_package.cypher](./External_Dependencies/External_package_usage_per_artifact_and_package.cypher) | External_Dependencies | External package usage per artifact and package |
83+
| [External_package_usage_per_artifact_and_package_tuned.cypher](./External_Dependencies/External_package_usage_per_artifact_and_package_tuned.cypher) | External_Dependencies | External package usage per artifact and package tuned |
8384
| [External_package_usage_per_artifact_and_package_without_annotations.cypher](./External_Dependencies/External_package_usage_per_artifact_and_package_without_annotations.cypher) | External_Dependencies | External package usage per artifact and package without annotations Note: The exists operation for "isAnnotation" is inefficient for large graphs. |
84-
| [External_package_usage_per_type.cypher](./External_Dependencies/External_package_usage_per_type.cypher) | External_Dependencies | External package usage per type |
85+
| [External_package_usage_per_type.cypher](./External_Dependencies/External_package_usage_per_type.cypher) | External_Dependencies | External package usage per type tuned |
8586
| [External_package_usage_per_type_distribution.cypher](./External_Dependencies/External_package_usage_per_type_distribution.cypher) | External_Dependencies | External package usage per type distribution |
86-
| [External_package_usage_per_type_distribution_without_annotations.cypher](./External_Dependencies/External_package_usage_per_type_distribution_without_annotations.cypher) | External_Dependencies | External package usage per type distribution without annotations Note: The exists operation for "isAnnotation" is inefficient for large graphs. |
87+
| [External_package_usage_per_type_distribution_without_annotations.cypher](./External_Dependencies/External_package_usage_per_type_distribution_without_annotations.cypher) | External_Dependencies | External package usage per type distribution without annotations |
8788
| [External_types_per_artifact_using_requires.cypher](./External_Dependencies/External_types_per_artifact_using_requires.cypher) | External_Dependencies | External types per artifact using requires |
89+
| [Label_external_types_and_annotations.cypher](./External_Dependencies/Label_external_types_and_annotations.cypher) | External_Dependencies | Label external types and annotations |
90+
| [List_external_types_used.cypher](./External_Dependencies/List_external_types_used.cypher) | External_Dependencies | List external types used |
8891
| [Maven_POMs_and_their_declared_dependencies.cypher](./External_Dependencies/Maven_POMs_and_their_declared_dependencies.cypher) | External_Dependencies | Maven POMs and their declared dependencies |
92+
| [Remove_external_type_and_annotation_labels.cypher](./External_Dependencies/Remove_external_type_and_annotation_labels.cypher) | External_Dependencies | Remove external type and annotation labels |
8993
| [Extract_Custom_Manifest_Entries.cypher](./Extract_Custom_Manifest_Entries.cypher) | | Extract Custom Manifest Entries |
9094
| [Get_Awesome_Procedures_On_Cypher_APOC_Version.cypher](./Get_Awesome_Procedures_On_Cypher_APOC_Version.cypher) | | Get Awesome Procedures On Cypher APOC Version |
9195
| [Get_Graph_Data_Science_Library_Version.cypher](./Get_Graph_Data_Science_Library_Version.cypher) | | Get Graph Data Science Library Version |

cypher/External_Dependencies/External_package_usage_overall.cypher

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
1-
// External package usage overall
1+
// External package usage overall tuned
22

33
MATCH (type:Type)
44
WITH count(type) as allTypes, collect(type) as typeList
55
UNWIND typeList AS type
6-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:Type)
6+
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
77
WITH allTypes
88
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
9-
,externalType.name AS externalTypeName
10-
,externalDependency
11-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
12-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
13-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
14-
,(externalType.byteCodeVersion IS NULL) AS isExternalType
15-
WHERE isPrimitiveType = false
16-
AND isJavaType = false
17-
AND isAlsoInternalType = false
18-
AND isExternalType = true
19-
WITH allTypes
20-
,externalPackageName
21-
,count(externalDependency) AS numberOfExternalTypeCaller
22-
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
23-
,collect(DISTINCT externalTypeName) AS externalTypeNames
9+
,count(externalDependency) AS numberOfExternalTypeCaller
10+
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
11+
,collect(DISTINCT externalType.name) AS externalTypeNames
2412
RETURN externalPackageName
2513
,numberOfExternalTypeCaller
2614
,numberOfExternalTypeCalls

cypher/External_Dependencies/External_package_usage_per_artifact.cypher

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1-
// External package usage per artifact
1+
// External package usage per artifact tuned
22

3-
MATCH (artifact:Artifact)-[:CONTAINS]->(type:Type)
4-
WITH artifact, count(type) as numberOfTypesInArtifact, collect(type) as typeList
3+
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(type:Type)
4+
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
5+
,count(type) AS numberOfTypesInArtifact
6+
,collect(type) AS typeList
57
UNWIND typeList as type
6-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:Type)
7-
WHERE externalType.byteCodeVersion IS NULL
8+
MATCH (externalType:ExternalType)<-[externalDependency:DEPENDS_ON]-(type)
89
WITH numberOfTypesInArtifact
910
,externalDependency
10-
,replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
11+
,artifactName
1112
,type.fqn AS fullTypeName
1213
,type.name AS typeName
1314
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
14-
,externalType.name AS externalTypeName
15-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
16-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
17-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
18-
WHERE isPrimitiveType = false
19-
AND isJavaType = false
20-
AND isAlsoInternalType = false
15+
,externalType.name AS externalTypeName
2116
WITH numberOfTypesInArtifact
2217
,artifactName
2318
,externalPackageName
24-
,count(externalDependency) AS numberOfExternalTypeCaller
19+
,count(DISTINCT fullTypeName) AS numberOfExternalTypeCaller
2520
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
2621
,collect(DISTINCT externalTypeName) AS externalTypeNames
2722
RETURN artifactName
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// External package usage per artifact and package tuned
2+
3+
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(package:Package)
4+
MATCH (package)-[:CONTAINS]->(type:Type)
5+
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
6+
,package.fqn AS fullPackageName
7+
,package.name AS packageName
8+
,count(type) AS numberOfTypesInPackage
9+
,collect(type) AS typeList
10+
UNWIND typeList AS type
11+
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
12+
WHERE externalType.byteCodeVersion IS NULL
13+
AND NOT externalType:ExternalAnnotation
14+
WITH numberOfTypesInPackage
15+
,externalDependency
16+
,artifactName
17+
,fullPackageName
18+
,packageName
19+
,type.fqn AS fullTypeName
20+
,type.name AS typeName
21+
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
22+
,externalType.name AS externalTypeName
23+
WITH numberOfTypesInPackage
24+
,artifactName
25+
,fullPackageName
26+
,packageName
27+
,externalPackageName
28+
,count(externalDependency) AS numberOfExternalTypeCaller
29+
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
30+
,collect(DISTINCT externalTypeName) AS externalTypeNames
31+
RETURN artifactName, fullPackageName
32+
,externalPackageName
33+
,numberOfExternalTypeCaller, numberOfExternalTypeCalls, numberOfTypesInPackage
34+
,externalTypeNames
35+
,packageName
36+
ORDER BY numberOfExternalTypeCaller DESC, artifactName ASC, fullPackageName ASC
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
// External package usage per type
1+
// External package usage per type tuned
22

3-
MATCH (artifact:Artifact)-[:CONTAINS]->(package:Package)
3+
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(package:Package)
44
MATCH (package)-[:CONTAINS]->(type:Type)
5-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:Type)
6-
WHERE externalType.byteCodeVersion IS NULL
5+
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
76
WITH externalDependency
87
,replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
98
,package.fqn AS fullPackageName
@@ -12,12 +11,6 @@
1211
,type.name AS typeName
1312
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
1413
,externalType.name AS externalTypeName
15-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
16-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
17-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
18-
WHERE isPrimitiveType = false
19-
AND isJavaType = false
20-
AND isAlsoInternalType = false
2114
WITH artifactName
2215
,fullPackageName
2316
,packageName
@@ -30,8 +23,8 @@
3023
,count (DISTINCT externalPackageName + '.' + externalTypeName) AS numberOfExternalTypes
3124
,collect(DISTINCT externalPackageName + '.' + externalTypeName) AS externalTypeNames
3225
RETURN artifactName, fullPackageName, typeName
33-
,numberOfExternalTypeCaller, numberOfExternalTypeCalls, numberOfExternalPackages, numberOfExternalTypes
26+
,numberOfExternalTypeCaller, numberOfExternalTypeCalls
3427
,externalPackageNames, externalTypeNames
3528
,packageName
3629
,fullTypeName
37-
ORDER BY numberOfExternalPackages DESC, artifactName ASC, fullPackageName ASC
30+
ORDER BY artifactName ASC, fullPackageName ASC, numberOfExternalTypeCalls DESC
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
// External package usage per type distribution
22

3-
MATCH (artifact:Artifact)-[:CONTAINS]->(type:Type)
3+
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(type:Type)
44
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
55
,count(type) AS artifactTypes
66
,collect(type) AS typeList
77
UNWIND typeList AS type
8-
MATCH (type)-[:DEPENDS_ON]->(externalType:Type)
9-
WHERE externalType.byteCodeVersion IS NULL
8+
MATCH (type)-[:DEPENDS_ON]->(externalType:ExternalType)
109
WITH artifactName
1110
,artifactTypes
1211
,type.fqn AS fullTypeName
1312
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
14-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
15-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
16-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
17-
// ,exists((externalType)<-[:OF_TYPE]-()<-[:ANNOTATED_BY]-()) AS isAnnotation
18-
WHERE isPrimitiveType = false
19-
AND isJavaType = false
20-
AND isAlsoInternalType = false
21-
// AND isAnnotation = false
2213
WITH artifactName
2314
,artifactTypes
2415
,fullTypeName
@@ -32,6 +23,5 @@ RETURN artifactName
3223
,artifactTypes
3324
,numberOfExternalPackages
3425
,numberOfTypes
35-
,100.0 / artifactTypes * numberOfTypes AS numberOfTypesPercentage
3626
,nameOfTypes
3727
ORDER BY artifactName ASC, numberOfExternalPackages ASC
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
// External package usage per type distribution without annotations
2-
// Note: The exists operation for "isAnnotation" is inefficient for large graphs.
32

4-
MATCH (artifact:Artifact)-[:CONTAINS]->(type:Type)
3+
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(type:Type)
54
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
65
,count(type) AS artifactTypes
76
,collect(type) AS typeList
87
UNWIND typeList AS type
9-
MATCH (type)-[:DEPENDS_ON]->(externalType:Type)
10-
WHERE externalType.byteCodeVersion IS NULL
8+
MATCH (type)-[:DEPENDS_ON]->(externalType:ExternalType)
9+
WHERE NOT externalType:ExternalAnnotation
1110
WITH artifactName
1211
,artifactTypes
1312
,type.fqn AS fullTypeName
1413
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
15-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
16-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
17-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
18-
,exists((externalType)<-[:OF_TYPE]-()<-[:ANNOTATED_BY]-()) AS isAnnotation
19-
WHERE isPrimitiveType = false
20-
AND isJavaType = false
21-
AND isAlsoInternalType = false
22-
AND isAnnotation = false
2314
WITH artifactName
2415
,artifactTypes
2516
,fullTypeName
@@ -33,6 +24,5 @@ RETURN artifactName
3324
,artifactTypes
3425
,numberOfExternalPackages
3526
,numberOfTypes
36-
,100.0 / artifactTypes * numberOfTypes AS numberOfTypesPercentage
3727
,nameOfTypes
3828
ORDER BY artifactName ASC, numberOfExternalPackages ASC
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Label external types and annotations
2+
3+
MATCH (externalType:Type)
4+
WHERE externalType.byteCodeVersion IS NULL // byte code not available -> external dependency
5+
WITH externalType
6+
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
7+
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
8+
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
9+
,exists((externalType)<-[:OF_TYPE]-()<-[:ANNOTATED_BY]-()) AS isAnnotation
10+
WHERE isPrimitiveType = false
11+
AND isJavaType = false
12+
AND isAlsoInternalType = false
13+
WITH externalType
14+
,CASE WHEN isAnnotation THEN [1] ELSE [] END AS annotated
15+
FOREACH (x in annotated | SET externalType:ExternalAnnotation)
16+
SET externalType:ExternalType
17+
RETURN labels(externalType), count(externalType) as numberOfExternalTypes
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// List external types used
2+
3+
MATCH (external:ExternalType) RETURN external.fqn
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// Remove external type and annotation labels
2+
3+
MATCH (externalType:ExternalType)
4+
REMOVE externalType:ExternalType:ExternalAnnotation

0 commit comments

Comments
 (0)