我有以下图表结构:
(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
似乎可以解决问题,看起来是否正确?
答案 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值将为空。
此外,如果建筑物(或建筑物中的任何楼层/房间)根本没有资产,那么您仍然会在结果中获得一行,但所有值都将为空。
我没有回复任何标签,因为这种方法不需要。