检查顶点是否存在,如果它不使用注入的属性列表创建它

Check if a vertex exist, if it doesn't create it using an injected list of properties

更新: 我觉得很傻。决定只查询数据库以获取所有名称的列表,list_of_names_in_db = g.V().hasLabel('Person').values('name').toList() 然后将 list_of_name_in_dbbatch 进行比较,并且只为不在两个列表中的顶点添加顶点。


学习 Gremlin-Python 一个多星期后,我有 table 个要循环的顶点,对于 table 中的每个顶点,我正在检查它是否已经存在。如果没有,请创建它。我看过很多示例,但是 none 个示例使用 inject() 与 coalesce 协作。这是不可能的事情,还是我做错了?这是我尝试过的:

from gremlin_python import statics
from gremlin_python.structure.graph import Graph
from gremlin_python.process.graph_traversal import __
from gremlin_python.process.strategies import *
from gremlin_python.process.traversal import Column
from gremlin_python.process.anonymous_traversal import traversal

batch = [
    {
        'name': 'John',
        'age': 20,
        'height': 67,
        'weight': 140,
        'blood-type': 'B+',
        'state': 'PA',
        'email': 'Johnny5@gmail.com'
    },
    {
        'name': 'Steve',
        'age': 25,
        'height': 60,
        'weight': 110,
        'blood-type': 'B+',
        'state': 'CA',
        'email': 'DidIDoThat@gmail.com'
    }
]

g.inject(batch).as_('data').
    coalesce(
        __.V().has('Person','name',__.select('data').unfold().select('name')),
        __.addV('Person').as_('P').
        select('data').unfold().as_('kv').
        select('P').property(
            __.select('kv').by(Column.keys),
            __.selecy('kv'.by(Column.values)))
        ).iterate()

问题是每次查询 运行 时都会创建重复的条目。我认为这是因为 inject() 与 coalesce() 的位置相关?但我不确定。

附带问题: 我已经包含了我的导入,因为我仍然必须在我的一些步骤前面使用'__',即使我已经导入了 from gremlin_python.process.graph_traversal import __ 'keys' 也是如此。我必须使用 Column.keys 我错过了一步吗?

has 步骤不能进行遍历,因为它是第二个参数,因此查询没有像您预期的那样工作。在最近发布的 TinkerPop 3.6 版本中,添加了一个新的 mergeV 步骤,使您想要做的事情变得更加简单。在图数据库提供商升级到 TinkerPop 版本之前,您仍然需要使用地图注入和 coalesce 的某种组合。在这种情况下,您不需要使用 has,而是需要使用 where....by 构造来构建存在性测试。

如果可能,与其检查名称 属性 是否存在,不如检查已知的唯一顶点 ID 是否存在,如果找不到,则创建它。

使用 air-routes 数据集,这是映射注入加上 where...by 模式的稍微简化的形式:

gremlin> g.inject(['code':'AUS']).as('codes').
......1>   V().as('v').
......2>   where(eq('v')).
......3>     by(select('codes').select('code')).
......4>     by('code')
==>v[3]

但如前所述,如果可能的话,我会寻找已知 ID 的存在,只有在找不到时才使用地图创建顶点。