graph - 如何在连通图中匹配 Gremlin 中未链接的顶点
问题描述
我有一个简单的图表,其中包含尚未链接的人员节点(假设超过 10K 人员节点)和规则节点(大约少数规则),这两种类型的节点之间不存在边。我想要做的是通过匹配 Gremlin 中的属性值在它们之间创建边缘。
people 节点有四个属性:name、age、state、registered。规则节点具有三个属性:年龄、状态、注册.. 不同的规则节点将具有不同的属性值,例如 (registered=true, state=WA, age > 22) 等。
如何编写一个可以将具有匹配属性值的所有人员节点与每个规则节点链接的 gremlin?
解决方案
给出评论中的附加信息的示例图可能如下所示:
g = TinkerGraph.open().traversal()
g.addV('person').
property('name','daniel').
property('age',37).
property('state','AZ').
addV('person').
property('name','howell').
property('age',25).
property('state','WA').
addV('person').
property('name','john').
property('age',19).
property('state','NV').
addV('rule').
property('state','WA').
property('state','CA').
property('state','OR').
property('minimumAge',22).
addV('rule').
property('state','AZ').
property('state','FL').
property('state','TX').
property('minimumAge',19).
iterate()
我不太确定这是否age > 22
是故意的,但让我们假设您实际上只是在寻找相等匹配;那么您的查询将是:
g.V().hasLabel('people').as('person').
V().hasLabel('rule').
where(eq('person')).
by(values('age','state','registered').fold()).
addE('hasRule').
from('person')
要匹配person
和rule
顶点,您可以执行类似的操作(根据需要添加更多规则):
g.V().hasLabel('person').as('person').
V().hasLabel('rule').
where(lte('person')).by('minimumAge').by('age').
filter(values('state').where(eq('person')).by().by('state')).
addE('hasRule').
from('person').iterate()
此查询将在示例图中添加 2 条边(没有规则,john
因为他太年轻了):
gremlin> g.V().outE().inV().path().by('name').by(label).by(valueMap())
==>[daniel,hasRule,[minimumAge:[19],state:[AZ,FL,TX]]]
==>[howell,hasRule,[minimumAge:[22],state:[WA,CA,OR]]]
推荐阅读
- google-sheets - 如何创建一个数组公式来计算一行中三个不同值的中位数?
- regex - case 和 ifnull 语句 - 任何人都可以解释下面的代码
- css - 以这种方式使用 SCSS 地图是不好的做法吗?
- python - 在 Python Dash 中的单击事件上返回“href”值
- c - 如何将 PETSc Vec 数组传递给函数
- c++ - 无法在 C++ 中创建 tesseract::TessBaseAPI 的实例
- c# - 在不使用临时变量的情况下交换两个数字
- wordpress - get_taxonomy_labels 只返回标签
- spring-boot - 为什么 get 请求在 Spring Boot 中给出空响应?
- spring-boot - 基于 Open API 3 继承的不同示例