检查顶点是否存在,如果它不使用注入的属性列表创建它
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_db
与 batch
进行比较,并且只为不在两个列表中的顶点添加顶点。
学习 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 的存在,只有在找不到时才使用地图创建顶点。
更新:
我觉得很傻。决定只查询数据库以获取所有名称的列表,list_of_names_in_db = g.V().hasLabel('Person').values('name').toList()
然后将 list_of_name_in_db
与 batch
进行比较,并且只为不在两个列表中的顶点添加顶点。
学习 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 的存在,只有在找不到时才使用地图创建顶点。