【问题标题】:How to query nodes in a graph where the directly connected nodes to it satisfy a condition如何查询图中直接连接的节点满足条件的节点
【发布时间】:2020-01-11 04:57:45
【问题描述】:

我有兴趣使用以下模式从我的 Neo4j 图中收集节点

match (a)-[r:reln]->(b) return b 

使得给定“b”的所有“a”节点都满足某些条件,例如a.prop='xxxx'

注意:在一对“a”和“b”节点之间可能存在多种类型关系:reln。

我尝试使用 all() 函数,但这似乎没有帮助。

【问题讨论】:

  • 您能分享一下您是如何使用 all() 函数的吗?那有什么问题?
  • 我能够更新我的查询以使用以下所有函数实现过滤,但不确定如何在返回集中包含 a.prop match (a)-[:reln]->(b) with collect(a) as pts, b where all(pt in pts where pt.prop = 'xxxx') return b.prop
  • 它是像'xxxx'这样的固定值,那么您可以只返回该值以及b.prop,而不是尝试获取a.prop。或者您也在寻找“a”的其他值?
  • 我也有兴趣获得 'a' 的其他属性。
  • 您是否想要针对每个 b 节点或 b.prop、a.prop1、a.prop2 等对的这些属性列表?

标签: neo4j cypher


【解决方案1】:

您可以使用List comprehension 从列表pts 创建所需属性的列表,如下所示:

MATCH (a)-[:reln]->(b) 
WITH collect(a) as pts, b 
WHERE all(pt IN pts WHERE pt.prop = 'xxxx')  
RETURN b.prop, [ p IN pts | { prop1: p.prop1, prop2:p.prop2 }] AS a_props

如果您希望针对每个 b 节点获取 a 的属性对:

MATCH (a)-[:reln]->(b) 
WITH collect(a) as pts, b 
WHERE all(pt IN pts WHERE pt.prop = 'xxxx') 
UNWIND pts AS a
RETURN b.prop, { prop1: a.prop1, prop2:a.prop2 } AS a_props

MATCH (a)-[:reln]->(b) 
WITH collect(a) as pts, b 
WHERE all(pt IN pts WHERE pt.prop = 'xxxx') 
UNWIND pts as a
RETURN b.prop, a.prop, a.prop2

【讨论】:

    【解决方案2】:

    获取所有reln关系的结束节点,其中开始节点的prop属性等于'xxxx':

    MATCH (a)-[:reln]->(b)
    WHERE a.prop = 'xxxx'
    RETURN a, b
    

    如果您想返回起始节点的一些单独属性,只需在RETURN 子句中指定它们即可。例如:

    ...
    RETURN a.prop, a.prop2, a.prop3, b
    

    注意:您应该考虑使用 labels 和可能的 indexing 来帮助加快查询速度。

    【讨论】:

    • 对不起,如果我没有在我的问题中说清楚。我对一组节点b 感兴趣,其中所有使用reln 连接到它的节点的prop 等于xxxx。如果任何a 节点不满足条件,我想从结果集中过滤掉b。我可以通过上面评论中提到的查询来实现这一点,但我无法在RETURN 子句中访问a 的属性。
    • 我已经从查询中删除了标签和索引以保持简单。
    • 在这种情况下,看看@Raj 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多