2017-06-12 23 views
1

我正在设置一个图形结构与变换器'需要'和'产生'1个或多个卡夫卡主题。我可以定义图形结构,但是我希望对查询有所帮助。生产者和要求的查询依赖链

我想查询:要创建某个主题需要哪些变换器和主题链,例如在下面的示例中,生成Topic3需要哪些变换器。我期望

Ingest1->Topic7->T1->Topic1->T2->Topic3 

下面的第一个答案是不完全正确的,因为它没有考虑到要求和产生的交替方向。 正确的查询到一定深度会是这样的

MATCH (topic:Topic{name:"topic-3"}) 
<-[:produces]- (tr1) -[:requires]->(tp1) 
<-[:produces]- (tr2) -[:requires]->(tp2) 
<-[:produces]- (tr3) 
return [topic,tr1,tp1,tr2,tp2,tr3] as List 

这样看来,我寻找的东西,可重复配对产生/需要顶点。

这是我玩的一些数据。

CREATE (DB1:Database {backbone: true, name:"postgres db 1"}) 
CREATE (Ingest1:Ingest {backbone: true, name: "ingest-1"}) 

CREATE (KV1:KV {name: "key-value store 1"}) 
CREATE (KV2:KV {name: "key-value store 2"}) 
CREATE (KV1)-[:requires]->(DB1) 
CREATE (KV2)-[:requires]->(DB1) 
CREATE (Topic1:Topic {name: "topic-1", partitions:100}) 
CREATE (Topic2:Topic {name: "topic-2", partitions:100}) 
CREATE (Topic3:Topic {name: "topic-3", partitions:100}) 
CREATE (Topic4:Topic {name: "topic-4", partitions:100}) 
CREATE (Topic5:Topic {name: "topic-5", partitions:100}) 
CREATE (Topic6:Topic {name: "topic-6", partitions:100}) 
CREATE (Topic7:Topic {name: "topic-7", partitions:100}) 
CREATE (Topic8:Topic {name: "topic-8", partitions:100}) 
CREATE (T2:Transformer {name: "T2"}) 
CREATE (T1:Transformer {name: "T1"}) 
CREATE (T3:Transformer {name: "T3"}) 
CREATE (T4:Transformer {name: "T4"}) 
CREATE (T5:Transformer {name: "T5"}) 
CREATE (T6:Transformer {name: "T6"}) 
CREATE (T7:Transformer {name: "T7"}) 
CREATE (T8:Transformer {name: "T8"}) 
CREATE (T9:Transformer {name: "T9"}) 
CREATE (T4)-[:requires]->(Topic3) 
CREATE (T5)-[:requires]->(Topic3) 
CREATE (T2)-[:produces]->(Topic3) 
CREATE (T2)-[:produces]->(Topic4) 
CREATE (T2)-[:produces]->(KV1) 
CREATE (T2)-[:requires]->(Topic1) 
CREATE (T4)-[:produces]->(Topic5) 

CREATE (T2)-[:requires]->(Topic2) 
CREATE (T1)-[:produces]->(Topic1) 
CREATE (T1)-[:requires]->(Topic7) 
CREATE (T3)-[:produces]->(Topic2) 
CREATE (T3)-[:requires]->(Topic8) 
CREATE (Ingest1)-[:produces]->(Topic7) 
CREATE (Ingest1)-[:produces]->(Topic8); 

回答

1

这样的事情呢?

// find the transformer from the selected topic 
MATCH (topic3:Topic {name: "topic-3"})<-[produces]-(transformer:Transformer) 

// find the path(s) back from the transformer to the ingest 
MATCH p=(transformer)-[:produces|requires*]-(i:Ingest) 

// put the names in a collection from topic3 back to ingest 
WITH reduce(chain = [topic3.name], n in nodes(p) | chain + n.name) as chain 

// return the collection in the desired order 
RETURN reverse(chain) 

它可以简化这一以及

MATCH p=(topic3:Topic {name: "topic-3"})-[:produces|requires*]-(i:Ingest) 
WITH reduce(chain = [topic3.name], n in nodes(p) | chain + n.name) as chain 
RETURN reverse(chain) 
+0

我不认为你的第一个解决方案是完全正确的:-) 我在定义中增加了几个变压器和主题(见并且第二个查询返回: '[ingest-1,topic-7,T1,topic-1,T2,topic-3,topic-3]' '[ingest-1,topic-8, T3,topic-2,T2,topic-3,topic-3]' '[ingest-1,topic-7,T1,topic-1,T2,topic-3,topic-3]' ' 1,话题-8,T3话题-2,T2,topic-3,topic-3]' 逻辑正确 –