2017-06-06 39 views
1

我已经完成了一些Google搜索并尝试了几件事情,但我还没有找到解决方案。我对图数据库,Neo4j和cypher比较陌生。Neo4J,密码:来自指定节点的单向查询

附加是一个图像,我希望能够更容易解释。图形包含Block(粉红色),Input(绿色),Output(蓝色)和Property(红色)节点,关系类型为PART_OF,connectingTo,hasInPort和hasOutPort。

我希望从block_3中检索所有节点,进入[:connectedTo]关系的方向。所以我期待的是块3,2,4和5以及它们的所有输入,输出和属性节点。 Block_3的输入也应该包含在内。

我觉得我还是不太了解查询的工作原理。如果有人能够确切地告诉我查询应该是什么样子,然后给出查询的不同部分的解释,我会非常感激。

Neo4J database

回答

1

的一般方法是找到到达所有所需的必要的关系/方向模式:从起始块节点:块节点,一旦你拥有所有这些:块节点,比赛的内容如下:输入,:输出和:属性节点。

这里最大的问题是关于您要遵循的模式的冲突关系方向。 :hasOutPort和:connectingTo都是外发的,这很好,但hasInPort关系指向相反的方向。

这是一个问题,因为使用多种关系类型的变长关系(这是解决此遍历的理想工具)只能为涉及的所有关系指定单个方向......如果我们让它成为任何方向,通过省略关系上的箭头),那么它将匹配incoming:connectedTo关系,这不是你想要的。

选项1:更改关系类型/方向

一个简单的建模解决将是改变之间的关系:输入节点和:块节点。

而不是你有什么目前:

(:Block)-[:hasInPort]->(:Input) 

你也可以使用这样的:

(:Block)<-[:inPortFor]-(:Input) 

如果你做出这种改变,那么路径你想一切都在同一个方向,查询变得容易:

// match from starting node to all :Block nodes along desired relationships 
MATCH (:Block{name:'block_3'})-[:hasOutPort|:connectsTo|:inPortFor*0..]->(block:Block) 
// use pattern comprehension to get lists of :Properties, :Input, and :Output nodes per :Block 
WITH block, [(block)-[:PART_OF]->(prop) | prop] as properties, 
[(block)-[:hasOutPort]->(output) | output] as outputs, 
[(block)<-[:inPortFor]-(input) | input] as inputs 
RETURN block, properties, outputs, inputs 

如果您不能或不会改变关系的方向/类型之间的关系EN:输入和:块节点,那么你不能采取这种方法(第一个可变长度匹配),需要一个不同的方法。

选项2:APOC程序

APOC Procedures是Neo4j的一个插件,具有良好的一些非常有用的过程和函数。其中之一是path expander,它允许指定沿不同关系的扩展,并且可以声明每个单独关系类型遵循哪个方向。使用这个,以及终止标签过滤器(所以你只能得到匹配:块节点),我们可以替换第一个匹配。

// match from starting node to all :Block nodes along desired relationships 
MATCH (start:Block{name:'block_3'}) 
CALL apoc.path.subgraphNodes(start, {labelFilter:'/Block', 
relationshipFilter:'hasOutPort>|connectsTo>|<hasInPort'}) YIELD node as block 
// use pattern comprehension to get lists of :Properties, :Input, and :Output nodes per :Block 
WITH block, [(block)-[:PART_OF]->(prop) | prop] as properties, 
[(block)-[:hasOutPort]->(output) | output] as outputs, 
[(block)-[:hasInPort]->(input) | input] as inputs 
RETURN block, properties, outputs, inputs