Skip to content

Commit 40f8afa

Browse files
committed
Tune cypher queries for external dependencies
1 parent fb89c4b commit 40f8afa

14 files changed

+141
-71
lines changed

cypher/CYPHER.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,29 @@ Script | Directory | Description
6767
| [Community_Detection_for_Types_6_Leiden_Delete_Labels.cypher](./Community_Detection_for_Types/Community_Detection_for_Types_6_Leiden_Delete_Labels.cypher) | Community_Detection_for_Types | Community Detection for Types 6 Leiden Delete Labels |
6868
| [Community_Detection_for_Types_7_Add_LeidenTypeCommunity_Id_label_to_types.cypher](./Community_Detection_for_Types/Community_Detection_for_Types_7_Add_LeidenTypeCommunity_Id_label_to_types.cypher) | Community_Detection_for_Types | Community Detection for Types 7 Add LeidenTypeCommunity+Id label to types with more than one member |
6969
| [Which_type_community_spans_several_artifacts_and_how_are_the_types_distributed.cypher](./Community_Detection_for_Types/Which_type_community_spans_several_artifacts_and_how_are_the_types_distributed.cypher) | Community_Detection_for_Types | Which type community spans several artifacts and how are the types distributed? |
70+
| [Count_nodes_and_relationships.cypher](./Count_nodes_and_relationships.cypher) | | Count nodes and relationships |
71+
| [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 |
72+
| [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 the full qualified type name |
7074
| [Cyclic_Dependencies.cypher](./Cyclic_Dependencies/Cyclic_Dependencies.cypher) | Cyclic_Dependencies | Cyclic Dependencies |
7175
| [Cyclic_Dependencies_Concatenated.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_Concatenated.cypher) | Cyclic_Dependencies | Cyclic Dependencies Concatenated |
7276
| [Cyclic_Dependencies_as_List.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_as_List.cypher) | Cyclic_Dependencies | Cyclic Dependencies as List |
7377
| [Cyclic_Dependencies_as_unwinded_List.cypher](./Cyclic_Dependencies/Cyclic_Dependencies_as_unwinded_List.cypher) | Cyclic_Dependencies | Cyclic Dependencies as unwinded List |
78+
| [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 |
7479
| [Export_the_whole_database_as_CSV.cypher](./Export_the_whole_database_as_CSV.cypher) | | Export the whole database as CSV |
75-
| [External_package_usage_overall.cypher](./External_Dependencies/External_package_usage_overall.cypher) | External_Dependencies | External package usage overall |
76-
| [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 |
7782
| [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 |
78-
| [External_package_usage_per_type.cypher](./External_Dependencies/External_package_usage_per_type.cypher) | External_Dependencies | External package usage per type |
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 |
84+
| [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. |
85+
| [External_package_usage_per_type.cypher](./External_Dependencies/External_package_usage_per_type.cypher) | External_Dependencies | External package usage per type tuned |
7986
| [External_package_usage_per_type_distribution.cypher](./External_Dependencies/External_package_usage_per_type_distribution.cypher) | External_Dependencies | External package usage per type distribution |
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 |
8088
| [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 |
8191
| [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 |
8293
| [Extract_Custom_Manifest_Entries.cypher](./Extract_Custom_Manifest_Entries.cypher) | | Extract Custom Manifest Entries |
8394
| [Get_Awesome_Procedures_On_Cypher_APOC_Version.cypher](./Get_Awesome_Procedures_On_Cypher_APOC_Version.cypher) | | Get Awesome Procedures On Cypher APOC Version |
8495
| [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
@@ -3,27 +3,15 @@
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
2715
,allTypes
2816
,externalTypeNames
29-
ORDER BY numberOfExternalTypeCaller DESC, externalTypeNames ASC
17+
ORDER BY numberOfExternalTypeCaller DESC, externalPackageName ASC
Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
1-
// External package usage per artifact
1+
// External package usage per artifact
22

3-
MATCH (artifact:Artifact)-[:CONTAINS]->(type:Type)
4-
WITH artifact, count(type) as numberOfTypesInArtifact, collect(type) as typeList
5-
UNWIND typeList as type
6-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:Type)
7-
WHERE externalType.byteCodeVersion IS NULL
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
7+
UNWIND typeList AS type
8+
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
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
1415
,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
2116
WITH numberOfTypesInArtifact
2217
,artifactName
2318
,externalPackageName
@@ -30,4 +25,4 @@ RETURN artifactName
3025
,numberOfExternalTypeCalls
3126
,numberOfTypesInArtifact
3227
,externalTypeNames
33-
ORDER BY artifactName ASC, numberOfExternalTypeCaller DESC
28+
ORDER BY artifactName ASC, numberOfExternalTypeCaller DESC, externalPackageName ASC

cypher/External_Dependencies/External_package_usage_per_artifact_and_package.cypher

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
1-
// External package usage per artifact and package
1+
// External package usage per artifact and package
22

33
MATCH (artifact:Artifact)-[:CONTAINS]->(package:Package)
44
MATCH (package)-[:CONTAINS]->(type:Type)
5-
WITH artifact, package, count(type) AS numberOfTypesInPackage, collect(type) as typeList
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
610
UNWIND typeList AS type
7-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:Type)
8-
WHERE externalType.byteCodeVersion IS NULL
11+
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
12+
WHERE NOT externalType:ExternalAnnotation
913
WITH numberOfTypesInPackage
1014
,externalDependency
11-
,replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
12-
,package.fqn AS fullPackageName
13-
,package.name AS packageName
15+
,artifactName
16+
,fullPackageName
17+
,packageName
1418
,type.fqn AS fullTypeName
1519
,type.name AS typeName
1620
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
1721
,externalType.name AS externalTypeName
18-
,(NOT externalType.fqn CONTAINS '.') AS isPrimitiveType
19-
,(externalType.fqn STARTS WITH 'java.') AS isJavaType
20-
,exists((externalType)-[:RESOLVES_TO]->(:Type)) AS isAlsoInternalType
21-
,exists((externalType)<-[:OF_TYPE]-()<-[:ANNOTATED_BY]-()) AS isAnnotation
22-
WHERE isPrimitiveType = false
23-
AND isJavaType = false
24-
AND isAlsoInternalType = false
25-
AND isAnnotation = false
2622
WITH numberOfTypesInPackage
2723
,artifactName
2824
,fullPackageName
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// External package usage per artifact and package with external annotations
2+
3+
MATCH (artifact:Artifact)-[: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+
WITH numberOfTypesInPackage
13+
,externalDependency
14+
,artifactName
15+
,fullPackageName
16+
,packageName
17+
,type.fqn AS fullTypeName
18+
,type.name AS typeName
19+
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
20+
,externalType.name AS externalTypeName
21+
WITH numberOfTypesInPackage
22+
,artifactName
23+
,fullPackageName
24+
,packageName
25+
,externalPackageName
26+
,count(externalDependency) AS numberOfExternalTypeCaller
27+
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
28+
,collect(DISTINCT externalTypeName) AS externalTypeNames
29+
RETURN artifactName, fullPackageName
30+
,externalPackageName
31+
,numberOfExternalTypeCaller, numberOfExternalTypeCalls, numberOfTypesInPackage
32+
,externalTypeNames
33+
,packageName
34+
ORDER BY numberOfExternalTypeCaller DESC, artifactName ASC, fullPackageName ASC

cypher/External_Dependencies/External_package_usage_per_type.cypher

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
MATCH (artifact:Artifact)-[: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

cypher/External_Dependencies/External_package_usage_per_type_distribution.cypher

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,12 @@
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)
9+
WHERE externalType:ExternalAnnotation
1010
WITH artifactName
1111
,artifactTypes
1212
,type.fqn AS fullTypeName
1313
,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
2214
WITH artifactName
2315
,artifactTypes
2416
,fullTypeName
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// External package usage per type distribution with external annotations
2+
3+
MATCH (artifact:Artifact)-[:CONTAINS]->(type:Type)
4+
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
5+
,count(type) AS artifactTypes
6+
,collect(type) AS typeList
7+
UNWIND typeList AS type
8+
MATCH (type)-[:DEPENDS_ON]->(externalType:ExternalType)
9+
WITH artifactName
10+
,artifactTypes
11+
,type.fqn AS fullTypeName
12+
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
13+
WITH artifactName
14+
,artifactTypes
15+
,fullTypeName
16+
,count(DISTINCT externalPackageName) AS numberOfExternalPackages
17+
WITH artifactName
18+
,artifactTypes
19+
,numberOfExternalPackages
20+
,count(DISTINCT fullTypeName) AS numberOfTypes
21+
,COLLECT(DISTINCT fullTypeName) AS nameOfTypes
22+
RETURN artifactName
23+
,artifactTypes
24+
,numberOfExternalPackages
25+
,numberOfTypes
26+
,100.0 / artifactTypes * numberOfTypes AS numberOfTypesPercentage
27+
,nameOfTypes
28+
ORDER BY artifactName ASC, numberOfExternalPackages ASC

cypher/External_Dependencies/External_types_per_artifact_using_requires.cypher

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
// External types per artifact using requires
22

3-
MATCH (artifact:Artifact)-[:REQUIRES]->(externalType:Type)
3+
MATCH (artifact:Artifact)-[:REQUIRES]->(externalType:ExternalType)
44
MATCH (artifact)-[:CONTAINS]->(caller:Type)
55
OPTIONAL MATCH (caller)-[callerDependency:DEPENDS_ON]->(externalType)
6-
WHERE NOT externalType.fqn STARTS WITH 'java.' // ignore
7-
AND externalType.fqn CONTAINS '.' // ignore primitives
8-
AND NOT EXISTS((externalType)-[:RESOLVES_TO]->(:Type))
96
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
107
,replace(externalType.fqn, '.' + externalType.name, '') AS externalTypePackage
118
,COLLECT(DISTINCT externalType.name) AS externalTypeNames
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

0 commit comments

Comments
 (0)