Java应用中如何通过List类型Phone属性匹配获取User顶点?
解决多值属性的Gremlin查询问题
嘿,我明白你遇到的问题了!你想用传入的电话号码列表,找到那些phone属性里包含其中任意一个号码的User顶点,但原来的查询没返回结果对吧?
问题出在哪?
你原来用的P.within(phone),如果是针对单值属性,它会检查属性值是否在传入的集合里;但对于多值属性(比如List<String>),有些图数据库的Gremlin实现可能会把它当成“属性的整个集合完全匹配传入的集合”,而不是“属性集合里存在至少一个元素在传入集合中”——这就是为什么你的查询没找到那个包含"704"的顶点。
正确的实现方法
这里有两种可靠的写法,能确保找到phone属性包含传入列表中任意一个号码的顶点:
方法1:用where步骤明确检查元素匹配
这种写法更清晰,兼容性也更好:
List<String> phone = new ArrayList<>(); phone.add("204"); phone.add("704"); List<Vertex> vertices = g.V() .hasLabel(label.getLabel()) .where(values("phone").is(P.within(phone))) .toList();
方法2:用intersect检查集合交集
如果你想更直观地验证两个集合有交集,也可以这么写:
List<String> phone = new ArrayList<>(); phone.add("204"); phone.add("704"); List<Vertex> vertices = g.V() .hasLabel(label.getLabel()) .where(values("phone").intersect(phone).count().is(P.gt(0))) .toList();
它的逻辑是:取出顶点的phone属性列表,和传入的号码列表取交集,如果交集元素数量大于0,就保留这个顶点。
额外要检查的点
- 确认
label.getLabel()返回的顶点标签和你创建的User顶点标签完全一致(比如是不是"User",大小写要匹配) - 确认你的User顶点的
phone属性确实是列表类型,而不是被错误存储成了单个字符串(比如"123,704,456"这种格式)
内容的提问来源于stack exchange,提问作者Ibney Ali
相关产品推荐
相关产品推荐

