2017-06-12 86 views
1

我正在研究依赖关系分析工具,并且提出了以下Cypher查询,它表示SCHEMAs拥有引用其他对象的对象,推断依赖从架构模式,就像如下:在Cypher中,确定连接引用对象的对象的类型(标签)

MATCH (sourceSchema:SCHEMA)-[:OWNS]->(objectOwnedBySource)-[:REFERENCES*..]->(objectOwnedByTarget)<-[:OWNS]-(targetSchema:SCHEMA) 
WHERE sourceSchema.name <> targetSchema.name 
WITH sourceSchema, targetSchema 
ORDER BY targetSchema.name 
RETURN sourceSchema.name AS schema, 
collect(distinct targetSchema.name) AS dependsOn 
ORDER BY sourceSchema.name 

上述查询返回的模式和他们的依赖关系,而真棒列表,它看起来是这样的:

schema dependsOn 
FOO  [BAR, BAZ, PUBLIC, SYS] 
BAR  [SYS] 
BAZ  [PUBLIC, SYS] 
(etc) 

一些帮助,我也设法创建一个查询,给我一个类型列表(la贝尔)以及它们在图中每个模式计数:

MATCH (sourceSchema:SCHEMA)-[:OWNS]->(objectOwnedBySource) 
RETURN DISTINCT sourceSchema.name AS schema, 
filter(x IN (labels(objectOwnedBySource)) WHERE NOT x="ENTITY")[0] AS type, 
count(*) AS count 
ORDER BY schema,type 

从上面的输出看起来像:

schema type  count 
FOO  TABLE  14 
FOO  SYNONYM 1 
BAR  FUNCTION 3 

我的问题是:我怎么莫名其妙地结合这一点,并获得标签的数导致架构模式依赖?我的意图是:

Schema   DependsOnSchema ThroughLabelOnReferencedObject Count 
FOO    BAR    TABLE       101 
FOO    BAR    VIEW        10 
FOO    BAZ    TABLE       6 
(etc) 

对于传入和传出引用的单独计数器的加分:-)。提前感谢任何提示!

回答

1

我想出了:

MATCH (sourceSchema:SCHEMA)-[:OWNS]->(objectOwnedBySource)-[:REFERENCES*..]->(objectOwnedByTarget)<-[:OWNS]-(targetSchema) 
WHERE sourceSchema <> targetSchema 
RETURN DISTINCT sourceSchema.name AS source, 
filter(x IN (labels(objectOwnedBySource)) WHERE NOT x="ENTITY")[0] AS sourceType, 
targetSchema.name AS target, 
filter(x IN (labels(objectOwnedByTarget)) WHERE NOT x="ENTITY")[0] AS targetType, 
count(*) AS references 
ORDER BY source,sourceType,target,targetType 

这给了我:

source sourceType target targetType references 
FOO  TABLE   BAR  SEQUENCE  3 
BAR  FUNCTION  BAZ  PACKAGE  10 
(etc) 
相关问题