【问题标题】:Gremlin Python returning empty graphGremlin Python 返回空图
【发布时间】:2017-09-06 08:25:18
【问题描述】:

我已经开始使用 gremlin-python 包装器来与我的 gremlin 服务器交互。

我做了以下步骤:

./bin/gremlin.sh

Gremlin 控制台打开后,我使用以下命令加载配置:

graph = JanusGraphFactory.open('conf/gremlin-server/janusgraph-cassandra-es.properties')
g = graph.traversal()
saturn = g.V().has('name', 'saturn')

gremlin shell 中的上述代码集工作正常,我可以看到列出的顶点,但是当我尝试在 python 中执行相同操作时,我得到一个空图。以下是我的python代码:

graph = Graph()
g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
print(g)

它返回: graphtraversalsource[graph[empty]]

为什么我得到空图表?据我所知,它无法连接到相同的 Graph 源。有什么我想念的吗?

注意在:

JanusGraphFactory.open('conf/gremlin-server/janusgraph-cassandra-es.properties')

提供的配置文件名用于启动 gremlin 服务器。

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: python gremlin tinkerpop gremlin-server janusgraph


    【解决方案1】:

    您看到 graph[empty] 的原因是因为这是 Python 图形对象的实际字符串表示形式 - 请参阅 code here。该图实际上可能包含数据,所以如果它是类似 graph[remote]graph[] 的东西会更好。我已经开通了issue 来解决这个问题。

    开箱即用,JanusGraph 未针对 Python 进行配置。您可以在 Apache TinkerPop docs 中找到有关如何执行此操作的文档。首先安装gremlin-python。以下是假设您使用的是使用 TinkerPop 3.2.3 的 JanusGraph 0.1.1 的命令:

    bin/gremlin-server.sh -i org.apache.tinkerpop gremlin-python 3.2.3
    

    接下来修改conf/gremlin-server/gremlin-server.yaml添加gremlin-python脚本引擎:

    scriptEngines: {
      gremlin-groovy: {
        imports: [java.lang.Math],
        staticImports: [java.lang.Math.PI],
        scripts: [scripts/empty-sample.groovy]},
      gremlin-jython: {},
      gremlin-python: {}
    }
    

    要使用Gremlin Python,需要通过Gremlin Server,所以启动JanusGraphpre-packaged distribution

    bin/janusgraph.sh start
    

    从 Gremlin 控制台:

    gremlin> graph = JanusGraphFactory.open('conf/janusgraph-cassandra-es.properties')
    ==>standardjanusgraph[cassandrathrift:[127.0.0.1]]
    gremlin> GraphOfTheGodsFactory.load(graph)
    ==>null
    gremlin> g = graph.traversal()
    ==>graphtraversalsource[standardjanusgraph[cassandrathrift:[127.0.0.1]], standard]
    gremlin> g.V().count()
    14:51:58 WARN  org.janusgraph.graphdb.transaction.StandardJanusGraphTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
    ==>12
    

    安装 Gremlin-Python 驱动程序,再次匹配 TinkerPop 版本:

    pip install gremlinpython==3.2.3
    

    从 Python 3 外壳:

    >>> 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.driver.driver_remote_connection import DriverRemoteConnection
    >>> graph = Graph()
    >>> g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
    >>> print(graph)
    graph[empty]
    >>> print(g)
    graphtraversalsource[graph[empty]]
    >>> g.V().count().next()
    12
    >>> g.addV('god').property('name', 'mars').property('age', 3500).next()
    v[4280]
    >>> g.V().count().next()
    13
    

    请记住,当您在 Python shell 中工作时,图遍历不会自动迭代,因此您需要确保使用 iterate()next()toList() 进行迭代。

    【讨论】:

    • 感谢您提供详细步骤,但我仍然遇到问题。当我做bin/janusgraph.sh start 时,它能够连接到 cassandra & es,但在 gremlin-server 上超时。我查看了日志,但没有堆栈跟踪来指出究竟是什么错误,只是我有时间了。我将等待时间从默认的 60 增加到 120,但仍然是同样的问题。这是预期的吗?谢谢
    • 去看我关于连接超时的评论,刚刚发现。如果我在conf/gremlin-server/gremlin-server.yaml 中将gremlin-jython: {}, gremlin-python: {} 添加到scriptEngines,我将面临超时错误,但如果没有,我不会。但是没有它,我仍然无法获取任何结果即使g.V().count().next() 抛出错误KeyError: None
    • 我在上面编辑了我的帖子,添加了几个步骤来安装gremlin-python 插件。如果您在 Gremlin 服务器上遇到超时,请尝试终止其进程,然后使用 bin/gremlin-server.sh 重新启动它,然后在原始问题中分享输出。
    • 我无法通过bin/janusgraph.sh start 使其工作,但通过bin/gremlin-server.sh 使其工作。在使用Gremlin-Python version 3.2.3 之后,现在也解决了没有获取任何内容的错误。我之前使用的是 3.3.0,可能版本不匹配。但现在我有另一个问题,你如何提交更改?我可以通过 g.addV('god').property('name', 'mars').property('age', 3500) 添加顶点,我的结果显示了我的顶点。但我该如何承诺?我试过g.addV(label, 'god', 'name', 'mars', 'age', 3000).tx().commit(),但失败了。我需要创建自己的Traversal()吗?
    • 而且,补充我之前的观点,我们如何将 GraphSON 加载到 gremlin-python 中?我去了tinkerpop.apache.org/docs/current/reference/#gremlin-python - > 自定义序列化但无法理解。抱歉打扰了这么多,如果需要,会添加到现有问题中,但非常感谢任何帮助。
    【解决方案2】:

    Gremlin 控制台中的本地“g”是图形的嵌入式实例。因此,它“包含”某些东西并且不是空的。对于 Python 中的“g”,它本身是“空的”,因为它本身没有顶点/边 - 顶点/边位于它所反映的 Gremlin 服务器上的远程图中。我假设如果您要在 python 中执行g.V().count(),您将获得与在 java 中执行相同操作时相同的顶点数。如果不是,那么还有其他问题,但不要指望“远程”图形实例显示任何类型的顶点/边(除非有一天 gremlin-python 被编写为具有自己的 Python 本机的 Gremlin 虚拟机附加到它的图形数据库 - 在这种情况下,“g”将被嵌入,因此拥有顶点/边,并且可能不再打印为“空”)。

    【讨论】:

    • 那么您的意思是说python 的grimlin 包装器无法获取存储在远程服务器上的数据/图形吗?如果是这种情况,获取空图似乎不是问题。但如果是这种情况,那么我们如何获取存储在 DB 上的 Graph,对其进行查询并使用 python 获取结果呢?
    • 没有。它完全有能力从远程图中获取数据。我要说的是它说“空”,因为数据不是本地的。它类似于 Java 中的EmptyGraph.instance()。您仅将其用作对实际保存数据的远程图的引用。基本上,不要被“空”标签所迷惑——它对实际远程可用的数据没有任何意义。
    • 如果我错了,请纠正我,所以你的意思是它显示为空,因为它实际上没有在本地存储任何数据,而是引用我的远程数据集?如果是这种情况,那么正如您所建议的那样, g.V().count() 应该给我一些结果吗?远程对象的数量对吗?但即使这样也会抛出 [['V'], ['count']]
    • 所以,我做了g.V().count().next(),现在它抛出了一个异常。 KeyError: None。可能的原因可能是我的图形实例实际上是空的。对此有何想法?
    • 所以,我从 gremlin 做g.V().count(),这就像一个魅力。我也做了addV(),然后尝试打印回来,虽然我没有提交,结果还是一样!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2020-09-05
    • 1970-01-01
    • 2017-05-19
    • 2017-05-29
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多