如何在预期的属性名称未知时查询图表?

时间:2018-02-21 19:28:00

标签: neo4j cypher

相关问题在这里: How to query property value when property name is a parameter?

让我们说如果我想问“推荐我500美元的手机”。在我的图表中,我有:

create (p:Product {name:"iPhone 1", price:"500", color:"white"})
create (p:Product {name:"iPhone 2", price:"400", color:"white"})
create (p:Product {name:"iPhone 3", price:"800", color:"black"})

根据语言“推荐我500美元的手机”,我知道我应该在产品节点上查询,但我不知道'价格'属性。我只想匹配任何产品节点的某些属性值=“500”。在这种情况下,如何在查询中实现这一点?

Match(p:Product) where p.x = 500

这里我不知道“x”是什么,我没有x接受的属性名称。这可能吗?

编辑:

match (p:Product)
where any(key in keys(node) where key contains 'TEST')
RETURN p.key

如何返回'p.key'值?

2 个答案:

答案 0 :(得分:2)

好吧,您可以使用any()keys()函数进行解决方法,但我认为不推荐这样做,因为您正在迭代所有节点属性而Neo4j将忽略所有财产指数:

match (node:Product)
where any(key in keys(node) WHERE node[key] = "500")
RETURN node

答案 1 :(得分:1)

目前尚不清楚您的[EDITED]问题是什么,所以这里有两种可能解释的答案:

  1. 如果您知道感兴趣的属性键包含字符串" TEST",并且您想要获取其不同的属性值:

    MATCH (p:Product)
    WITH p, [k in KEYS(p) WHERE k CONTAINS 'TEST' | p[k]] AS values
    UNWIND values AS value
    RETURN DISTINCT value;
    
  2. 如果您知道感兴趣的属性值包含字符串" TEST",并且您希望获得不同的值:

    MATCH (p:Product)
    WITH p, [k in KEYS(p) WHERE p[k] CONTAINS 'TEST' | p[k]] AS values
    UNWIND values AS value
    RETURN DISTINCT value;
    
  3. 如果展开的列表为空,则UNWIND操作不会产生任何行。

    请注意,这些查询很昂贵,因为他们必须扫描每个Product节点的每个属性。