TinkerPop技术问询:查询未关联Software顶点的Person顶点
解决TinkerPop Modern中查找未关联Software的Person顶点问题
我来帮你搞定这个查询问题!你的需求是找出TinkerPop Modern数据库中所有未直接连接到「Software」类型顶点的「Person」顶点,先分析下你现有代码的问题,再给出正确的实现。
先回顾你的可用代码
你已经能正确查询到关联了Software的Person,这段代码没问题:
g.V().hasLabel("Person").as("from") .project("title", "node") .by(select("from").unfold().values("name").fold()) .by(select("from").unfold().label().fold())
你的错误查询问题所在
你写的filter(both().not(hasLabel("Software")))逻辑不对:这个写法会检查当前Person的邻居中是否存在不是Software的顶点,只要有一个邻居不是Software,就会保留这个Person——但这和你的需求完全相反!你需要的是这个Person没有任何Software类型的邻居,所以必须用not()包裹“存在Software邻居”的判断。
正确的查询写法
这里给出两种可靠的实现方式,都能准确筛选出未关联Software的Person:
方式一:用not()直接排除有Software邻居的Person
这是最直观的写法,直接判断当前Person不存在任何方向连接到Software的边:
g.V().hasLabel("Person") .not(both().hasLabel("Software")) .project("title", "node") .by(values("name").fold()) .by(label().fold())
方式二:用where()配合not做更细致的判断
和方式一逻辑一致,只是用where()语法来表达,可读性同样很好:
g.V().hasLabel("Person") .where(not(both().hasLabel("Software"))) .project("title", "node") .by(values("name").fold()) .by(label().fold())
验证结果
在TinkerPop Modern标准数据集中,只有vadas这个Person顶点没有关联任何Software,所以上述查询会只返回vadas的相关数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Srinath Ganesh
相关产品推荐
相关产品推荐

