Neo4J,cypher:来自指定节点的单向查询

时间:2017-06-06 09:02:02

标签: neo4j cypher

我做了一些谷歌搜索,并尝试了几件事,但我还没有找到解决方案。我是图形数据库的新手,Neo4j和cypher。

附件是一张我希望能更容易解释的图片。图形具有块(粉红色),输入(绿色),输出(蓝色)和属性(红色)节点,关系类型为PART_OF,connectionsTo,hasInPort和hasOutPort。

我想从block_3中检索所有节点,朝[[连接]关系的方向前进。所以我期待的是块3,2,4和5以及它们的所有输入,输出和属性节点。还应包括Block_3的输入。

我认为我仍然不了解查询的工作原理。如果有人能够准确地告诉我查询应该是什么样子,然后对查询的不同部分进行解释,我将非常感激。

Neo4J database

1 个答案:

答案 0 :(得分:1)

一般的方法是找到达到所有期望所需的关系/方向模式:来自起始点的块节点:块节点,一旦你拥有所有这些:块节点,匹配它们:输入,:输出,和:属性节点。

这里最大的复杂因素是关于你想要遵循的模式的冲突关系方向。 :hasOutPort和:connectionsTo都是传出的,这很好,但是:hasInPort关系指向相反的方向。

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

选项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

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

选项2:APOC程序

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

// 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
相关问题