使用Cypher

时间:2017-06-21 18:05:33

标签: neo4j cypher

我们需要为每种类型的特定节点创建一个关于公共源的报告,以解释: 将Node的类型视为node.type = [" Apple"," Windows"," Linux"," Other"]和形式的关系

  

(来源:阳极) - [R:ConnectedTo] - GT;(目标:阳极)

因此,每种类型的来源将是:

match (source:ANode)-[r:ConnectedTo]->(target:ANode)
return distinct target.type, source.name

我们需要为每个成对的类型组合确定重复的来源,因此," Apple"之间的重复来源。和" Windows"," Windows"和" Linux"等

我已尝试过以下方法,但它似乎仅适用于第一对组合:

match (source:ANode)-[r:ConnectedTo]->(target:ANode)
where target.type="Apple"
return distinct target.type, source.name
UNION
match (source:ANode)-[r:ConnectedTo]->(target:ANode)
where target.type="Windows"
return distinct target.type, source.name

我已经可以使用以下代码确定任意两个系统之间的常见来源:

Match (node1:ANode)<-[:ConnectsTo]-(src)-[:ConnectsTo]->(node2:ANo‌​de) 
where ID(node1)<ID(node2) 
return node1.type,node1.name,node2.type,node2.name,src.name 

我无法看到如何从最终目标转变为最终目标。

我不认为这是正确的方法,因为类型的数量可能远远超过2-3。请帮助采用更优雅的方法

1 个答案:

答案 0 :(得分:1)

[EDITED]

您可以使用aggregation为每个源/目标类型对获取不同源名称的集合:

MATCH (source:ANode)-[r:ConnectedTo]->(target:ANode)
RETURN
  source.type AS sourceType,
  target.type AS targetType,
  COLLECT(DISTINCT source.name) AS sourceNames;