我做了一些谷歌搜索,并尝试了几件事,但我还没有找到解决方案。我是图形数据库的新手,Neo4j和cypher。
附件是一张我希望能更容易解释的图片。图形具有块(粉红色),输入(绿色),输出(蓝色)和属性(红色)节点,关系类型为PART_OF,connectionsTo,hasInPort和hasOutPort。
我想从block_3中检索所有节点,朝[[连接]关系的方向前进。所以我期待的是块3,2,4和5以及它们的所有输入,输出和属性节点。还应包括Block_3的输入。
我认为我仍然不了解查询的工作原理。如果有人能够准确地告诉我查询应该是什么样子,然后对查询的不同部分进行解释,我将非常感激。
答案 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