Cypher:如何沿路径返回多个节点?

时间:2014-03-26 15:12:26

标签: neo4j cypher

我有以下图表结构:

(Building)<-[:PART_OF]-(Floor)
(Floor)<-[:PART_OF]-(Room)
(Room)<-[:INSIDE]-(Asset)

建筑物和资产之间的所有节点都是可选的,例如,可能存在另一个层次结构,或者资产可以直接位于建筑物内。

获取我使用的特定建筑物中的所有资产:MATCH (b:Building {id: buildingId})<-[*]-(a:Asset) RETURN a

如何更改此查询以沿路径返回PART_OF层次结构?

Room,Floor,...的值存储在'value'属性中。

最终,我想知道每个返回的资产,楼层和房间的价值以及标签..

我想从MATCH (b:Building {id: {buildingId}})<-[:PART_OF*0..]-(x)<-[:INSIDE]-(a:Asset) RETURN a, labels(x), x.value之类的东西开始,但它只返回与资产直接相关的层次结构

编辑: match (b:Building)<-[:PART_OF*0..]-(x)<-[:PART_OF*0..]-()<-[:INSIDE]-(a:Asset) return a, labels(x), x.value似乎可以解决问题,看起来是否正确?

2 个答案:

答案 0 :(得分:2)

您可以尝试检查m:Machine和b:Building之间返回的路径。假设你不只是想要最短的路径并且假设你正在使用Cypher 2.0(它看起来像你),尝试这样的事情(注意路径的“p”绑定):

MATCH p = (m:Machine)-->(b:Building) RETURN nodes(p), rels(p)

(如果方向不是问题,您也可以使用“ - ”而不是“ - &gt;”。)

如果您需要返回的其他信息,您可以随时使用EXTRACT和其他功能,例如

RETURN EXTRACT(n IN nodes(p) | p.value)

希望这有帮助!

修改

我可能误解了这个问题。您可能想要使用“allShortestPaths”(围绕(m:机器) - >(b:建筑物)部分)或使用(m:机器) - [*] - &gt;(b:建筑物)用于可变深度路径(但是,如果我的原始答案没有给你你想要的东西,那么观看表演;你可能想要限制深度)。

答案 1 :(得分:2)

假设您在问题中提供了完整的图形结构,以下内容可能适合您的需求(我假设建筑物的'id'属性值已参数化}:

OPTIONAL MATCH (b:Building {id: {id}})<-[:PART_OF]-(f:Floor)<-[:PART_OF]-(r:Room)<-[:INSIDE]-(a:Asset)
RETURN a, f.value AS fVal, r.value as rVal
UNION
OPTIONAL MATCH (b)<-[:PART_OF]-(f:Floor)<-[:INSIDE]-(a:Asset)
RETURN a, f.value AS fVal, null as rVal
UNION
OPTIONAL MATCH (b)<-[:INSIDE]-(a:Asset)
RETURN a, null AS fVal, null as rVal;

如果资产不属于房间,则rVal值将为null。如果它也不是地板的一部分,那么fVal值将为空。

此外,如果建筑物(或建筑物中的任何楼层/房间)根本没有资产,那么您仍然会在结果中获得一行,但所有值都将为空。

我没有回复任何标签,因为这种方法不需要。