相关问题在这里: 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'值?
答案 0 :(得分:2)
好吧,您可以使用any()和keys()函数进行解决方法,但我认为不推荐这样做,因为您正在迭代所有节点属性而Neo4j将忽略所有财产指数:
match (node:Product)
where any(key in keys(node) WHERE node[key] = "500")
RETURN node
答案 1 :(得分:1)
目前尚不清楚您的[EDITED]
问题是什么,所以这里有两种可能解释的答案:
如果您知道感兴趣的属性键包含字符串" 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;
如果您知道感兴趣的属性值包含字符串" 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;
如果展开的列表为空,则UNWIND
操作不会产生任何行。
请注意,这些查询很昂贵,因为他们必须扫描每个Product
节点的每个属性。