为什么相同Gremlin查询在TinkerGraph与JanusGraph上返回结果不同?
问题原因解答
1. 两次查询count结果不同的原因
核心差异是JanusGraph和TinkerGraph的默认属性基数(Cardinality)策略不同:
- TinkerGraph是面向测试的内存图数据库,无预定义schema时默认属性基数为
LIST,允许同一个属性键存储多个值,连续两次调用property('name', xxx)的结果都会被保留,因此查询得到count为2,两个属性值都存在。 - JanusGraph默认属性基数为
SINGLE,即单值属性,同一个属性键仅能存储一个值,后续的赋值会直接覆盖前一次的内容,因此两次调用property('name', xxx)之后,仅保留最后一次写入的marko a. rodriguez,count结果为1。
2. Gremlin-Python传入list参数报错的原因
Gremlin控制台中直接使用的list是Gremlin语法内置的Cardinality.list枚举值,而Python环境中的list是Python原生的列表类型,两者定义完全不同。
当你直接把Python原生list传入Gremlin遍历语句时,序列化后会被识别为ArrayList类型,JanusGraph服务端无法识别这个参数作为属性基数的有效值,因此抛出.property(ArrayList, String, String)格式不匹配的错误。
正确写法需要先导入Gremlin-Python提供的基数枚举:
from gremlin_python.process.traversal import Cardinality
调用property时传入枚举值Cardinality.list_即可:
v = g.addV().property(Cardinality.list_, 'p_name','marko').property(Cardinality.list_, 'p_name','marko a. rodriguez').next()
3. 控制台执行list属性插入后count为0的常见原因
两个最可能的触发原因:
- JanusGraph默认开启事务,你插入数据后没有执行
g.tx().commit()提交事务,导致查询时无法读到未提交的数据 - 如果你提前预定义了
p_name属性的schema,其基数被设置为SINGLE,即使插入时指定了list基数,也会导致属性写入失败或者被覆盖
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

