【问题标题】:neo4j cypher select query in a tree-like structured graphNeo4j 密码选择查询在树状结构图中
【发布时间】:2020-01-23 08:47:30
【问题描述】:

我是 neo4j 和 cypher 的新手,正在尝试构建以下查询: 从图中选择棕色圈出的节点和关系(A、B、C、D、E、F、G、H和关系),因为如果我遇到一个树状结构的要求蓝色节点 我应该将此节点添加到结果中,但省略其子节点(相关节点)。在这种情况下,关系方向并不重要。

你能帮帮我吗?

编辑:添加了第二个示例。同样,所需的结果是被棕色线包围的节点。

【问题讨论】:

  • 如果E连接到F,你想要E节点在最终列表中
  • 是的,因为 E 也将连接到 B。
  • 所以,不同颜色的节点有不同的标签或者颜色是节点属性?
  • @yanislavgalyov 所以你想要所有间接连接的叶子和系统,以及直接连接到来自该搜索的元素的元素?
  • @Nobody 我添加了第二张图表。起点是节点 A,结果是从 A 扩展并以遇到的每个蓝色节点结束的节点。节点所需的结果被棕色线包围。

标签: neo4j cypher


【解决方案1】:
MATCH p=(c:LabelSystem)-[r*]->(d) 
WHERE d:LabelLeaf OR d:LabelElement 
WITH COLLECT(DISTINCT d) as labelElements,COLLECT(DISTINCT c) as labelSystem , c
MATCH (ls:LabelSystem)-[]-(le:LabelElement) 
WHERE le IN labelElements AND ls <> c
WITH COLLECT(DISTINCT ls) as  childLabelSystems,labelSystem,labelElements,c.uniqueProperty as uniqueIdentifier
WITH labelElements+childLabelSystems+labelSystem as allNodes,uniqueIdentifier
RETURN uniqueIdentifier,allNodes 

如果你在节点内部使用颜色作为属性,你可以相应地调整 WHERE

【讨论】:

  • 我将不得不花时间检查这个查询,但我赞成这项工作。谢谢你。如果这是正确的,我稍后会将其标记为答案。
  • 我相信如果我们使用 WHERE d:LabelLeaf,我们会失去性能,因为我们将通过每个关系来确定是否应该选择它?虽然对于给定的用例可能已经足够了
  • 因为我们需要匹配两种类型的节点,所以我们必须这样做。但是 cypher 使用标签扫描来做到这一点。它足够快:)
【解决方案2】:

阅读 apoc 文档后,我发现 apoc.path.expandConfig 函数几乎解决了我的问题。 所以解决办法是:

  1. 获取元素或叶子节点的路径
  2. 获取系统节点的路径
  3. 对于路径获取关系返回和返回段为:(start)-[relationship]-(end)
  4. 合并这些段以删除重复项

它正在工作,我的下一个任务是使用大图测试性能。有什么想法吗? @Nobody@TheCrusher

match (start: System) 
where id(start)=1
call apoc.path.expandConfig(start, { labelFilter: 'Element|Leaf' }) yield path
unwind relationships(path) as x
return startnode(x) as s, x as r, endnode(x) as e
union 
match (start: System) 
where id(start)=1
call apoc.path.expandConfig(start, { labelFilter: '>System' }) yield path
unwind relationships(path) as x
return startnode(x) as s, x as r, endnode(x) as e

编辑:我想出了另一个可以完成工作的查询:

match (s: System)-[r*]-(m)
where id(s)=1 and (m:Element or m:Leaf or m:System) and not (s)-[*]-(:System)-[*]-(m)
unwind r as r1
with distinct r1 as rd
return startnode(rd), rd, endnode(rd)

【讨论】:

  • 对于查找连接的系统节点,最好搜索连接到在第一个 expandConfig 中过滤的元素/叶节点的系统节点。因为这将是关系的一个小子集,比较从根系统节点到所有连接系统节点的所有路径。将是非常理想的性能明智
  • 是的,我也是这么想的,但想不出一个好的查询。
  • 我在我分享的查询中确实喜欢那个.. 你试过了吗?
  • 第二个查询会给出错误的结果。当元素节点连接到根节点并连接到系统节点时。这个元素节点有可能无法质量这个模式匹配not (s)-[*]-(:System)-[*]-(m)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2021-05-26
相关资源
最近更新 更多