Gremlin faunus脚本映射完成但未变异图

Gremlin faunus脚本映射完成但未变异图,gremlin,titan,faunus,Gremlin,Titan,Faunus,前奏曲:几个月的经验,在《野兽图》和《泰坦图》中使用了两种小精灵的“方言”,因此非常清楚功能和句法上的差异。已成功使用Faunus脚本步骤(,)对子图进行相对简单的删除和变异 问题:实现了一个复杂的变异脚本映射,以按照命名属性的面向方向约定将边属性“移动”到外顶点或内顶点。我的TitanGraph Gremlin原型可以在小型图形上工作,但我无法让放大的实现工作:映射成功完成,但图形没有更改(我正在提交更改)。注意:我的Logger对象只输出显示前缀args的第一条信息消息,这表明我没有满足边缘

前奏曲:几个月的经验,在《野兽图》和《泰坦图》中使用了两种小精灵的“方言”,因此非常清楚功能和句法上的差异。已成功使用Faunus脚本步骤(,)对子图进行相对简单的删除和变异

问题:实现了一个复杂的变异脚本映射,以按照命名属性的面向方向约定将边属性“移动”到外顶点或内顶点。我的TitanGraph Gremlin原型可以在小型图形上工作,但我无法让放大的实现工作:映射成功完成,但图形没有更改(我正在提交更改)。注意:我的Logger对象只输出显示前缀args的第一条信息消息,这表明我没有满足边缘名称空间保护条件(我在没有该条件的情况下运行了一次,但没有进行任何更改)。以下是我的代码(来自内部网络的胖手指,因此可能会出现打字错误)

//faunus管道驱动程序-用法gremlin-e faunus.ns.set-props.grm
导入java.io.Console
//获取args
console=System.console()
arg=console.readLine('>type;;;
inargs=arg.split(“;”)
//建立FaunusGraph连接
f=FaunusFactory.open('titan-client.properties')
f、 getConf().set(“faunus.graph.input.titan.storage.read一致性级别”、“全部”)
f、 getConf().set(“faunus.graph.input.titan.storage.write一致性级别”、“全部”)
//Faunus管道,包括脚本步骤
f、 V()具有(“_名称空间”,inargs[0]).script(inargs[1],inargs[2],inargs[3]
//脚本映射-用法f.V().has(“_namespace”,).script(,)
def g
def mylog
def设置(args){
mylog=java.util.logging.Logger.getLogger(“脚本映射”)
println(“配置图形…”)
conf=newbaseconfiguration()
conf.setProperty(“storage.backend”、“cassandra”)
conf.setProperty(“storage.keyspace”、“titan”)
conf.setProperty(“storage.index.index name”,“titan”)
conf.setProperty(“storage.hostname”、“localhost”)
g=工厂。打开(配置)
}
def映射(v,args){
mylog.info(“****读取*******参数:“+args[0].toString()+”,“+args[1].toString())
//获取与传入Faunus顶点对应的泰坦顶点上的所有边
gv=g.v(v.id)
edges=gv.bothE();null
//迭代通过事件边缘
while(edges.hasNext()){
e=边。下一步()
如果(e.hasProperty(“\u名称空间”){/\u名称空间已从先前处理的边中删除
/*获取当前边的终端顶点,添加关联和邻接道具
支持度量和分析
*/
from=e.getVertex(OUT)
from.setProperty(“inV_degree”,from.in().count())
from.setProperty(“inE_degree”,from.inE().count())
from.setProperty(“outV_degree”from.out().count())
from.setProperty(“outE_degree”,from.outE().count())
to=e.getVertex(英寸)
to.setProperty(“inV_degree”,from.in().count())
to.setProperty(“inE_degree”,from.inE().count())
to.setProperty(“outV_degree”from.out().count())
to.setProperty(“outE_degree”,from.outE().count())
mylog.info(“****读取*******边缘id:+e.id”)
mylog.info(“******读取******边顶点:从id“+fromid+”到id:+to.id”)
//获取当前边缘的属性键
ekeys=e.getPropertyKeys()
//遍历边属性键
用于(字符串ekey:ekeys)
eprop=e.getProperty(ekey)//获取当前属性键的值
goodprop=!(eprop==“”| | eprop==null)
mylog.info(“******读取******边缘键/值:”+ekey+“=”eprop)
/*确定当前键/值在一个或两个
基于关键点前缀arges和特性值的端子顶点,
从重新分配的键/值中删除前缀
*/
if(ekey.startsWith(args[0])&goodprop){
vkey=ekey.split(参数[0])[1]
如果(!from.hasProperty(vkey))from.setProperty(vkey,eprop)
否则{
vprop=from.getProperty(vkey)
如果(!vprop.equal(eprop)from.setProperty(vkey,vprop+“;”+eprop)
}
mylog.info(“****从顶点键读取******)/值:“+vkey+”=”+from.getProperty(vkey)
}
else if(ekey.startsWith(args[1])&goodprop){
vkey=ekey.split(参数[1])[1]
如果(!to.hasProperty(vkey))to.setProperty(vkey,eprop)
否则{
vprop=to.getProperty(vkey)
如果(!vprop.equal(eprop)到.setProperty(vkey,vprop+“;”+eprop)
}
mylog.info(“******读取******到顶点键/值:”+vkey+“=”+to.getProperty(vkey)
}
//如果重新指定了当前边特性关键点,请将其从边中删除
if(ekey.startsWith(args[0])| | ekey.startsWith(args[1])){
e、 removeProperty(ekey)
如果(e.hasProperty(ekey)println(ekey+“未从边缘删除”)
else println(ekey+“从边缘删除”)
}
e、 removeProperty(“_名称空间”)//将边标记为按外部循环保护处理
}
}
}
g、 提交()
}
def清除(args){
g、 关机()
}
此行:

if (e.hasProperty("_namespace")) {
hasProperty
似乎不在Blueprints API或Titan API中。既然如此,我不确定此代码在较小的测试数据库中是如何工作的,因为它将始终解析为
false
,并且如果
语句:

gremlin> x = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> v = x.V('name','marko').next()                     
==>v[1]
gremlin> if (v.hasProperty('name')) { true } else { false } 
==>false
我想你真的想试试这个:

gremlin> if (v.getProperty('name')) { true } else { false }
==>true
gremlin> if (v.getProperty('xxx')) { true } else { false } 
==>false

与您的实际问题无关的简短评论:我会惊讶地发现
.in().count()
.inE().count()
之间存在差异。只使用后者就足够了。给出一个
gremlin> if (v.getProperty('name')) { true } else { false }
==>true
gremlin> if (v.getProperty('xxx')) { true } else { false } 
==>false