我有一个朋友-朋友数据模型,它根据一个朋友如何定义另一个朋友,在任意两个朋友节点之间有两个关系。例如,用户"A“可以将用户"B”定义为“朋友”,而"B“可以将"A”定义为“伙伴”。问题是,当我试图获得用户"A“的第三级关系时,它返回用户"B",而实际结果应该是"D”。
MATCH(a:Users {first_name : "A"}) -[:BUDDY|FRIEND*3] -> (b)
RETURN a,b
或
MATCH (a)-[]-(b)-[]-(c)-[]-(d)
WHERE a.first_name="A"
RETURN a,d
发布于 2019-12-17 20:17:55
或者,您可以执行以下操作:
MATCH p=((a:Users {first_name : "A"})-[:BUDDY|FRIEND*3]->(b))
WITH DISTINCT a, b, nodes(p) as nodes
UNWIND nodes AS node
WITH a, b, nodes, COLLECT(DISTINCT node) as distinct_nodes
WITH a, b WHERE SIZE(nodes)=SIZE(distinct_nodes)
RETURN a, b
或者使用APOC调用会更简单一些:
MATCH p=((a:Users {first_name : "A"})-[:BUDDY|FRIEND*3]->(b))
WITH DISTINCT a, b WHERE SIZE(nodes(p)) = SIZE(apoc.coll.toSet(nodes(p)))
RETURN a, b
发布于 2019-12-17 16:23:21
我建议APOC Path Expander过程使用一种只考虑到节点的单一路径的扩展方法,允许指定最大和最小深度,采用关系筛选器,并设置是否允许多次访问节点。具体地说,apoc.path.expandConfig()过程应该满足您的需要。
MATCH (a:Users {first_name: "A"})
CALL apoc.path.expandConfig(a, {relationshipFilter:"BUDDY|FRIEND",minLevel:3,maxLevel:3, bfs:true,uniqueness:"NODE_GLOBAL"}) YIELD path
RETURN a, path
唯一性:“NODE_GLOBAL”参数确保没有节点被访问超过一次。
https://stackoverflow.com/questions/59371986
复制相似问题