簡體   English   中英

使用 Gremlin 移除 Neptune 中的整棵樹

[英]Removing an entire tree in Neptune using Gremlin

我是使用 Gremlin + Neptune 的新手。 我正在編寫一個小的 python 程序來清理 Neptune DB 中的一些邊 + 節點。 首先,我想刪除以特定節點為根的所有節點 + 邊。

環顧四周后,我遇到了如何在使用 gremlin 查詢刪除父節點時刪除所有子節點? ,我嘗試了以下方法:

g.V().has("id", <insert id>).union(__(), __.repeat(__.out()).emit()).drop()

但是,帶有“id”的節點仍然存在於數據庫中。 當我嘗試直接在 python3 控制台上運行上述命令時,我得到以下輸出:

>>> g.V().has("id", <insert id>).union(__(), __.repeat(__.out()).emit()).drop()
[['V'], ['has', 'id', '5c4266a3a44649ddb24ce6cf4f831300'], ['union', <gremlin_python.process.graph_traversal.__ object at 0x7fa51c967fd0>, [['repeat', [['out']]], ['emit']]], ['drop']]

這里發生了什么? 它幾乎看起來像是列出了它計划采取的步驟,但沒有執行它們。

編輯 - 從下面的答案,我添加.iterate()到最后。 我現在收到此錯誤:

Traceback (most recent call last):
  ...
    tg.g.V().has("id", <id>).union(__(), __.repeat(__.out()).emit()).drop().iterate()
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/process/traversal.py", line 66, in iterate
    try: self.nextTraverser()
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/process/traversal.py", line 71, in nextTraverser
    self.traversal_strategies.apply_strategies(self)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/process/traversal.py", line 573, in apply_strategies
    traversal_strategy.apply(traversal)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/remote_connection.py", line 149, in apply
    remote_traversal = self.remote_connection.submit(traversal.bytecode)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/driver_remote_connection.py", line 55, in submit
    result_set = self._client.submit(bytecode)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/client.py", line 111, in submit
    return self.submitAsync(message, bindings=bindings).result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 428, in result
    return self.__get_result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/connection.py", line 66, in cb
    f.result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 428, in result
    return self.__get_result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/protocol.py", line 74, in write
    request_id, request_message)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/serializer.py", line 132, in serialize_message
    message = self.build_message(request_id, processor, op, args)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/serializer.py", line 142, in build_message
    return self.finalize_message(message, b"\x21", self.version)
  File "/home/vagrant/.cache/bazel/_bazel_vagrant/f9910d98673307a31f928c448bd4acd0/execroot/project/bazel-out/k8-fastbuild/bin/path/to/directory/python_code.runfiles/pip_deps/pypi__gremlinpython/gremlin_python/driver/serializer.py", line 145, in finalize_message
    message = json.dumps(message)
  File "/usr/lib/python3.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type __ is not JSON serializable

與 Gremlin 控制台不同,Python 控制台不會自動為您迭代遍歷 在您的應用程序代碼中,您必須自己迭代它們。 當你做

g.V().has("id", <insert id>).union(__.identity(), __.repeat(__.out()).emit()).drop()

它只是生成一個Traversal對象但不執行它。 因此,您必須以某種方式迭代它以耗盡其中的元素 - 在您的情況下,要使用的適當終止符是iterate()

g.V().has("id", <insert id>).union(__.identity(), __.repeat(__.out()).emit()).drop().iterate()

不幸的是,TinkerPop 中關於 drop 的語義並不總是一致的。 TinkerPop 試圖為提供者在他們如何實現這一點上保持靈活性,但有時會引起混淆,因為查詢在 TinkerGraph 中可以正常工作,但在不同的提供者上執行時表現略有不同。 如果上面的方法只掉root,可以嘗試在drop之前實現結果:

g.V().has("id", <insert id>).
  union(__.identity(), 
        __.repeat(__.out()).emit()).
  fold().unfold().
  drop()

看起來有點笨,但會強制您希望刪除的所有頂點在刪除之前遍歷到列表中。 這樣,您不會通過首先刪除父路徑及其邊緣並讓子路徑未經過來終止repeat()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM