简体   繁体   English

faunus脚本图完成但不变异图

[英]faunus script map completing but not mutating graph

Prelude: Several months experience using both Gremlin "dialects" for FaunusGraph & TitanGraph, so well aware of the functional and syntactic diffs. 序言:几个月在FaunusGraph和TitanGraph上同时使用Gremlin“方言”的经验,因此非常了解功能和语法差异。 Have successfully used Faunus script step ( http://architects.dzone.com/articles/distributed-graph-computing , https://github.com/thinkaurelius/faunus/blob/master/src/main/java/com/thinkaurelius/faunus/mapreduce/sideeffect/ScriptMap.java ) for relatively simple deletion & mutation of subgraphs. 已经成功地使用法乌努斯脚本步骤( http://architects.dzone.com/articles/distributed-graph-computinghttps://github.com/thinkaurelius/faunus/blob/master/src/main/java/com/thinkaurelius /faunus/mapreduce/sideeffect/ScriptMap.java ),用于子图的相对简单的删除和变异。

Problem: Implemented a complex mutation script map to "move" edge properties to either the out-vertex or the in-vertex per a direction-oriented convention for naming properties. 问题:实现了一个复杂的变异脚本映射,以便按照命名属性的面向方向的约定将边缘属性“移动”到外部或内部。 My TitanGraph Gremlin prototype works on small graphs, but I can't get the scaled-up implementation to work: the map completes successfully but the graph isn't changed (I am committing the changes). 我的TitanGraph Gremlin原型可以在小型图形上运行,但无法使按比例放大的实现起作用:地图成功完成,但图形未更改(我正在提交更改)。 NOTE: my Logger object is only outputing the first INFO message that displays the prefix args, indicating I'm not satifying the edge namespace guard condition (I did a run without the condition, but no change). 注意:我的Logger对象仅输出显示前缀args的第一条INFO消息,指示我没有满足边缘名称空间保护条件(我没有条件运行但没有任何改变)。 Following is my code (fat-fingering from an internal net, so typos are possible) 以下是我的代码(来自内部网络的胖手指,因此可能出现错字)

//faunus pipe driver - usage gremlin -e faunus.ns.set-props.grm
import java.io.Console

//get args
console=System.console()
arg=console.readLine('> type <namespace>;<faunus.ns.set-props.mapper_path>;<from_prefix>;<to_prefix>
inargs=arg.split(";")

//establish FaunusGraph connection
f=FaunusFactory.open('titan-client.properties')
f.getConf().set("faunus.graph.input.titan.storage.read-consistency-level", "ALL")
f.getConf().set("faunus.graph.input.titan.storage.write-consistency-level", "ALL")

//Faunus pipe incl. script step
f.V().has("_namespace", inargs[0]).script(inargs[1], inargs[2], inargs[3]

//script map - usage f.V().has("_namespace", <namespace_string>).script(<this_script_path>, <outV_key_prefix_string>, <inV_key_prefix_string>)

def g
def mylog

def setup(args) {
    mylog=java.util.logging.Logger.getLogger("script_map")
    println("configuring graph ...")
    conf=new BaseConfiguration()
    conf.setProperty("storage.backend", "cassandra")
    conf.setProperty("storage.keyspace", "titan")
    conf.setProperty("storage.index.index-name", "titan")
    conf.setProperty("storage.hostname", "localhost")
    g=TitanFactory.open(conf)
}

def map(v, args) {
    mylog.info("*****READ***** args: "+args[0].toString()+", "+args[1].toString())

    //fetch all edges incident on Titan vertex corresponding to incoming Faunus vertex
    gv=g.v(v.id)
    edges=gv.bothE();null

    //iterate through incident edges
    while(edges.hasNext()) {
        e=edges.next()
        if (e.hasProperty("_namespace")) { //_namespace removed from previously processed edges
            /*fetch terminal vertices of current edge, add incidence & adjacency props
            to support metrics and analytics
            */
            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(IN)
            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("*****READ*****edge id:  "+e.id)
            mylog.info("*****READ*****edge vertices:  from id"+fromid+"; to id:  "+to.id)

            //fetch property keys of current edge
            ekeys=e.getPropertyKeys()

            //iterate through edge property keys
            for(String ekey:ekeys)
                eprop=e.getProperty(ekey) //get value of current property key
                goodprop=!(eprop == "" || eprop == null)
                mylog.info("*****READ*****edge key/value: "+ekey+"="eprop)

                /*determine placement of current key/value on one or neither of the 
               terminal vertices based on key prefix arges and property value,
               remove prefix from re-assigned key/value
               */

               if(ekey.startsWith(args[0]) && goodprop) {
                   vkey=ekey.split(args[0])[1]
                   if(!from.hasProperty(vkey)) from.setProperty(vkey, eprop)
                   else {
                       vprop=from.getProperty(vkey)
                       if(!vprop.equal(eprop) from.setProperty(vkey, vprop+";"+eprop)
                   }
                   mylog.info("*****READ*****from vertex key/value:  "+vkey+"="+from.getProperty(vkey)
               }
               else if(ekey.startsWith(args[1]) && goodprop) {
                   vkey=ekey.split(args[1])[1]
                   if(!to.hasProperty(vkey)) to.setProperty(vkey, eprop)
                   else {
                       vprop=to.getProperty(vkey)
                       if(!vprop.equal(eprop) to.setProperty(vkey, vprop+";"+eprop)
                   }
                   mylog.info("*****READ*****tovertex key/value:  "+vkey+"="+to.getProperty(vkey)
               }

               //if current edge property key is re-assigned, remove it from the edge
               if(ekey.startsWith(args[0]) || ekey.startsWith(args[1])) {
                   e.removeProperty(ekey)
                   if(e.hasProperty(ekey) println(ekey+" NOT remvoded from edge")
                   else println(ekey+ "removed from edge")
                }
                e.removeProperty("_namespace") // marks edge as processed per outer loop guard
            }
        }
    }
    g.commit()
}

def cleanup(args) {
    g.shutdown()
}

This line: 这行:

if (e.hasProperty("_namespace")) {

hasProperty doesn't seem to be in the Blueprints API or the Titan API. hasProperty似乎不在Blueprints API或Titan API中。 Since that is the case, I'm not sure how this code worked in your smaller test db, as it will always resolve to false and you will never see the inside of that if statement: 既然是这种情况,我不确定此代码在较小的测试数据库中如何工作,因为它将始终解析为false并且您将永远看不到if语句的内部:

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

I suppose you really want to try this: 我想您真的想尝试一下:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 gremlin用户定义的faunus脚本图中的步骤 - gremlin user defined steps in faunus script map Faunus图不使用gremlin shell的副作用就无法打印节点 - Faunus graph not printing nodes without using side effect from gremlin shell 泰坦-福努斯-格林姆林 - Titan - Faunus - Gremlin Examples JSON文件格式的Faunus JSON阅读器错误 - Faunus json reader error in json file format TinkerGraph:为什么在使用Graph时通过GraphTraversalSource进行的变异不会持久/存储? - TinkerGraph: why mutating through GraphTraversalSource doesn't persist/store while using Graph does? Groovy脚本无法将边添加到Gremlin图 - Groovy script fails to add edges to a Gremlin graph 如何将Tinkerpop3图映射到递归数据结构? - How to map a Tinkerpop3 graph to a recursive data structure? Tinkerpop 和 ArangoDB:MissingPropertyException:没有这样的属性:class 的图表:Script1 - Tinkerpop and ArangoDB : MissingPropertyException: No such property: graph for class: Script1 如何将janus图导入添加到gremlin groovy脚本引擎中? - How to add janus graph imports to gremlin groovy script engine? 在gremlin groovy脚本引擎初始化期间,如何用janus-graph导入替换tinkerpop导入? - How to replace tinkerpop imports by janus-graph imports during initialization of gremlin groovy script engine?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM