Экспорт графика Tinkerpop с помощью writeGraph () в другой OutputStream - PullRequest
3 голосов
/ 05 мая 2020

Следующий оператор создаст новый файл на сервере графа:

graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(new FileOutputStream("export.graphml"), graph)

Я хочу использовать другой OutputStream , чтобы увидеть вывод непосредственно в моем клиенте gremlin. Я пробовал DataOutputStream (), но получил исключение NullPointerException. Как мне получить ответ от writeGraph ()?

1 Ответ

2 голосов
/ 07 мая 2020

Первоначально я прочитал этот вопрос как желающий узнать, как создать удаленный OutputStream для записи с сервера обратно в какой-то локальный файл на клиенте, который, вероятно, имеет какое-то решение, но я не уверен, каков ответ. который. Поскольку я случайно смотрю на этот вопрос еще раз, хотя в сообщении баунти, вы заинтересованы в «Экспорт полного графика tinkerpop на консоль», и в этом случае, возможно, подойдет другой подход.

Я бы просто построил GraphMLWriter напрямую, используя его Builder, а затем записал бы byte[] и вернул бы его как String:

baos = new ByteArrayOutputStream()
graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(baos, graph)
baos.toByteArray()

Вот полный консольный сеанс, хотя я пропустил некоторые из графических файлов, чтобы улучшить читаемость:

gremlin> :remote connect tinkerpop.server conf/remote-objects.yaml session
==>Configured localhost/127.0.0.1:8182-[df3107c1-b25b-4f1c-a1f3-552353e9023d]
gremlin> :remote console
==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182]-[df3107c1-b25b-4f1c-a1f3-552353e9023d] - type ':remote console' to return to local mode
gremlin> baos = new ByteArrayOutputStream();[]
gremlin> graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(baos, graph);[]
gremlin> new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8)
==><?xml version="1.0" ?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.1/graphml.xsd">
    <key id="age" for="node" attr.name="age" attr.type="int"></key>
    <key id="labelV" for="node" attr.name="labelV" attr.type="string"></key>
    <key id="lang" for="node" attr.name="lang" attr.type="string"></key>
    <key id="name" for="node" attr.name="name" attr.type="string"></key>
    <key id="labelE" for="edge" attr.name="labelE" attr.type="string"></key>
    <key id="weight" for="edge" attr.name="weight" attr.type="double"></key>
    <graph id="G" edgedefault="directed">
        <node id="1">
            <data key="labelV">person</data>
            <data key="age">29</data>
            <data key="name">marko</data>
        </node>
        ...
</graphml>
gremlin> :remote console
==>All scripts will now be evaluated locally - type ':remote console' to return to remote mode for Gremlin Server - [localhost/127.0.0.1:8182]-[df3107c1-b25b-4f1c-a1f3-552353e9023d]
gremlin> result
==>result{object=<?xml version="1.0" ?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.1/graphml.xsd">
    <key id="age" for="node" attr.name="age" attr.type="int"></key>
    <key id="labelV" for="node" attr.name="labelV" attr.type="string"></key>
    <key id="lang" for="node" attr.name="lang" attr.type="string"></key>
    <key id="name" for="node" attr.name="name" attr.type="string"></key>
    <key id="labelE" for="edge" attr.name="labelE" attr.type="string"></key>
    <key id="weight" for="edge" attr.name="weight" attr.type="double"></key>
    <graph id="G" edgedefault="directed">
        <node id="1">
            <data key="labelV">person</data>
            <data key="age">29</data>
            <data key="name">marko</data>
        </node>
       ...
</graphml> class=java.lang.String}
gremlin> result.get(0).getString()
==><?xml version="1.0" ?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.1/graphml.xsd">
    <key id="age" for="node" attr.name="age" attr.type="int"></key>
    <key id="labelV" for="node" attr.name="labelV" attr.type="string"></key>
    <key id="lang" for="node" attr.name="lang" attr.type="string"></key>
    <key id="name" for="node" attr.name="name" attr.type="string"></key>
    <key id="labelE" for="edge" attr.name="labelE" attr.type="string"></key>
    <key id="weight" for="edge" attr.name="weight" attr.type="double"></key>
    <graph id="G" edgedefault="directed">
        <node id="1">
            <data key="labelV">person</data>
            <data key="age">29</data>
            <data key="name">marko</data>
        </node>
        ...
    </graph>
</graphml>
gremlin> 

Мой пример консоли Gremlin отправляет сценарии на сервер для выполнения в сеансе (таким образом, этот подход также будет работать как отправленный сценарий от драйверов, предполагая, что он отправляется как один сценарий или при использовании сеанса каждую строку можно отправлять отдельно). Обратите внимание, что результат каждой строки, возвращаемой сервером, сохраняется в переменной result в консоли. Для того, чтобы это работало правильно, важно, чтобы вы подключились к конфигурации, подобной той, которая представлена ​​в remote-objects.yaml по умолчанию, где возвращаются объекты, а не просто строковые представления, хотя в этом случае, поскольку конечным объектом является String, он может не так важно. Я полагаю, зависит ли это от того, что вы собираетесь делать с самим результатом, когда он у вас есть.

Некоторые предостережения, которые следует учитывать:

  1. Для большого графика эта операция будет довольно дорого, потому что это не только полное сканирование графа, но и запись всего графа в память перед его потоковой передачей обратно.
  2. Использование Graph API (т.е. graph.io()) и / или Прямое использование реализаций GraphWriter не рекомендуется, поэтому я полагаю, что эти API могут исчезнуть в будущих версиях, но учитывая, что в настоящее время нет лучших решений, я боюсь, что нет особого выбора.
...