Увеличить формат GraphML

Кто-нибудь может объяснить формат GraphML, который использует Boost? Он включает в себя уровень косвенности, который другие авторы GraphML не используют. Я включил вывод GraphML из 2 источников, оба из которых исходят из одних и тех же входных данных. Я не понимаю, почему Boost использует дополнительный уровень косвенности с ключевыми словами ‘key [0-N]’. Любые убедительные объяснения очень ценятся.

Я ищу способ настроить Boost для получения вывода, который похож или идентичен выводу, который производит Java / Tinkerpop, как показано в первом примере ниже. Я хотел бы устранить косвенность «key [0-N]».

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

    <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="UnitName" for="node" attr.name="UnitName" attr.type="string" />
<key id="id" for="node" attr.name="id" attr.type="int" />
<key id="labelV" for="node" attr.name="labelV" attr.type="string" />
<key id="EdgeName" for="edge" attr.name="EdgeName" attr.type="string" />
<key id="labelE" for="edge" attr.name="labelE" attr.type="string" />
<key id="length" for="edge" attr.name="length" attr.type="long" />
<key id="sourceport" for="edge" attr.name="sourceport" attr.type="string" />
<key id="targetport" for="edge" attr.name="targetport" attr.type="string" />
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="labelV">vertex</data>
<data key="UnitName">Div:101</data>
<data key="id">101</data>
</node>
<node id="n1">
<data key="labelV">vertex</data>
<data key="UnitName">Blow:1</data>
<data key="id">1</data>
</node>
<node id="n2">
<data key="labelV">vertex</data>
<data key="UnitName">Div:201</data>
<data key="id">201</data>
</node>
<node id="n3">
<data key="labelV">vertex</data>
<data key="UnitName">Blow:2</data>
<data key="id">2</data>
</node>
<node id="n4">
<data key="labelV">vertex</data>
<data key="UnitName">Sta:10 Sta10</data>
<data key="id">10</data>
</node>
<node id="n5">
<data key="labelV">vertex</data>
<data key="UnitName">Sta:11 Sta11</data>
<data key="id">11</data>
</node>
<node id="n6">
<data key="labelV">vertex</data>
<data key="UnitName">IZ:1002</data>
<data key="id">1002</data>
</node>
<node id="n7">
<data key="labelV">vertex</data>
<data key="UnitName">Sta:20</data>
<data key="id">20</data>
</node>
<node id="n8">
<data key="labelV">vertex</data>
<data key="UnitName">Sta:21</data>
<data key="id">21</data>
</node>
<edge id="e0" source="n0" target="n4">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:101 to Sta:10 Sta10</data>
<data key="length">80</data>
<data key="sourceport">0</data>
<data key="targetport"></data>
</edge>
<edge id="e1" source="n0" target="n5">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:101 to Sta:11 Sta11</data>
<data key="length">80</data>
<data key="sourceport">1</data>
<data key="targetport"></data>
</edge>
<edge id="e2" source="n0" target="n6">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:101 to IZ:1002</data>
<data key="length">20</data>
<data key="sourceport">3</data>
<data key="targetport"></data>
</edge>
<edge id="e3" source="n1" target="n0">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Blow:1 to Div:101</data>
<data key="length">0</data>
<data key="sourceport"></data>
<data key="targetport"></data>
</edge>
<edge id="e4" source="n2" target="n7">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:201 to Sta:20</data>
<data key="length">80</data>
<data key="sourceport">0</data>
<data key="targetport"></data>
</edge>
<edge id="e5" source="n2" target="n8">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:201 to Sta:21</data>
<data key="length">80</data>
<data key="sourceport">1</data>
<data key="targetport"></data>
</edge>
<edge id="e6" source="n2" target="n6">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Div:201 to IZ:1002</data>
<data key="length">20</data>
<data key="sourceport">3</data>
<data key="targetport"></data>
</edge>
<edge id="e7" source="n3" target="n2">
<data key="labelE">edge</data>
<data key="EdgeName">Edge from Blow:2 to Div:201</data>
<data key="length">0</data>
<data key="sourceport"></data>
<data key="targetport"></data>
</edge>
</graph>
</graphml>

Вот те же данные, что и при использовании функции write_graphml () из C ++ из библиотеки графов ускорения:

    <?xml version="1.0" encoding="UTF-8"?>
<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.0/graphml.xsd">
<key id="key0" for="edge" attr.name="EdgeName" attr.type="string" />
<key id="key1" for="node" attr.name="UnitName" attr.type="string" />
<key id="key2" for="node" attr.name="id" attr.type="int" />
<key id="key3" for="edge" attr.name="length" attr.type="long" />
<key id="key4" for="edge" attr.name="sourceport" attr.type="string" />
<key id="key5" for="edge" attr.name="targetport" attr.type="string" />
<graph id="G" edgedefault="directed" parse.nodeids="free" parse.edgeids="canonical" parse.order="nodesfirst">
<node id="n0">
<data key="key1">Div:101</data>
<data key="key2">101</data>
</node>
<node id="n1">
<data key="key1">Blow:1</data>
<data key="key2">1</data>
</node>
<node id="n2">
<data key="key1">Sta:20</data>
<data key="key2">20</data>
</node>
<node id="n3">
<data key="key1">Div:201</data>
<data key="key2">201</data>
</node>
<node id="n4">
<data key="key1">Sta:21</data>
<data key="key2">21</data>
</node>
<node id="n5">
<data key="key1">Zn:1====Zn:2:1002</data>
<data key="key2">1002</data>
</node>
<node id="n6">
<data key="key1">Sta:10 Sta10</data>
<data key="key2">10</data>
</node>
<node id="n7">
<data key="key1">Sta:11 Sta11</data>
<data key="key2">11</data>
</node>
<node id="n8">
<data key="key1">Blow:2</data>
<data key="key2">2</data>
</node>
<edge id="e0" source="n0" target="n6">
<data key="key0">Edge from Div:101 to Sta:10 Sta10</data>
<data key="key3">80</data>
<data key="key4">0</data>
<data key="key5"></data>
</edge>
<edge id="e1" source="n0" target="n7">
<data key="key0">Edge from Div:101 to Sta:11 Sta11</data>
<data key="key3">80</data>
<data key="key4">1</data>
<data key="key5"></data>
</edge>
<edge id="e2" source="n0" target="n5">
<data key="key0">Edge from Div:101 to Zn:1====Zn:2:1002</data>
<data key="key3">20</data>
<data key="key4">3</data>
<data key="key5"></data>
</edge>
<edge id="e3" source="n1" target="n0">
<data key="key0">Edge from Blow:1 to Div:101</data>
<data key="key3">0</data>
<data key="key4"></data>
<data key="key5"></data>
</edge>
<edge id="e4" source="n3" target="n2">
<data key="key0">Edge from Div:201 to Sta:20</data>
<data key="key3">80</data>
<data key="key4">0</data>
<data key="key5"></data>
</edge>
<edge id="e5" source="n3" target="n4">
<data key="key0">Edge from Div:201 to Sta:21</data>
<data key="key3">80</data>
<data key="key4">1</data>
<data key="key5"></data>
</edge>
<edge id="e6" source="n3" target="n5">
<data key="key0">Edge from Div:201 to Zn:1====Zn:2:1002</data>
<data key="key3">20</data>
<data key="key4">3</data>
<data key="key5"></data>
</edge>
<edge id="e7" source="n8" target="n3">
<data key="key0">Edge from Blow:2 to Div:201</data>
<data key="key3">0</data>
<data key="key4"></data>
<data key="key5"></data>
</edge>
</graph>
</graphml>

У нас конфликт между двумя приложениями. Приложение Boost изначально экспортирует GraphML. Другое приложение использует JanusGraph / Gremlin / Tinkerpop для загрузки GraphML в качестве входных данных и создания графика. Хотя GraphML синтаксически верен, JanusGraph / Tinkerpop выдает исключение при чтении GraphML:

java.lang.IllegalArgumentException: Name cannot be in protected namespace: edge
at org.janusgraph.graphdb.types.system.SystemTypeManager.isNotSystemName(SystemTypeManager.java:72)
at org.janusgraph.graphdb.types.StandardRelationTypeMaker.name(StandardRelationTypeMaker.java:188)
at org.janusgraph.graphdb.types.StandardRelationTypeMaker.<init>(StandardRelationTypeMaker.java:57)
at org.janusgraph.graphdb.types.StandardEdgeLabelMaker.<init>(StandardEdgeLabelMaker.java:42)
at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.makeEdgeLabel(StandardJanusGraphTx.java:980)
at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.getOrCreateEdgeLabel(StandardJanusGraphTx.java:965)
at org.janusgraph.graphdb.vertices.AbstractVertex.addEdge(AbstractVertex.java:163)
at org.janusgraph.graphdb.vertices.AbstractVertex.addEdge(AbstractVertex.java:37)
at org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader.readGraph(GraphMLReader.java:191)

Я обнаружил, что могу обойти это, отредактировав GraphML и выполнив глобальный поиск / замену по key0 и заменив его на labelE. Я не совсем уверен, почему это работает, и, очевидно, я пытаюсь избежать этого шага, поэтому нашей первой мыслью было заставить Boost экспортировать это поле как «labelE» вместо «key0».

С другой стороны, Tinkerpop прекрасно загружает оригинальный GraphML, если я использую Tinkergraph в памяти. Исключение возникает только тогда, когда я использую JanusGraph в качестве своей основной базы данных.

2

Решение

Я ищу способ настроить Boost для получения вывода, который похож или идентичен выводу, который производит Java / Tinkerpop, как показано в первом примере ниже. Я хотел бы устранить косвенность «key [0-N]».

Ты путаешь себя. Выход TinkerPop имеет точно такой же уровень косвенности. Единственное отличие состоит в том, что TinkerPop решает, что он знает, что идентификаторы для ключей данных узла и края подобные.

Нет никакой разницы для инструментов, которые читают XML.

На самом деле, даже следующее будет эквивалентно:

<graphml>
<key id="UnitName" for="node" attr.name="UnitName" attr.type="string" />
<key id="labelV" for="node" attr.name="labelV" attr.type="string" />
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="labelV">vertex</data>
<data key="UnitName">Div:101</data>
</node>
<node id="n1">
<data key="labelV">vertex</data>
<data key="UnitName">Blow:1</data>
</node>
</graph>
</graphml>

Там нет разницы с:

<graphml>
<key id="labelV" for="node" attr.name="UnitName" attr.type="string" />
<key id="UnitName" for="node" attr.name="labelV" attr.type="string" />
<graph id="G" edgedefault="directed">
<node id="n0">
<data key="UnitName">vertex</data>
<data key="labelV">Div:101</data>
</node>
<node id="n1">
<data key="UnitName">vertex</data>
<data key="labelV">Blow:1</data>
</node>
</graph>
</graphml>

Да, это будет сбивать с толку человек читая этот XML, но люди не читают этот XML.

Вы действительно должны спросить себя, почему для вас важно, чтобы эти детали указано, что не имеет значения важно для вас. Скорее всего, это даже не так.

Конечно, вы можете оказаться в трудном положении, если инструмент, читающий XML, был запрограммирован с неверными предположениями (a.k.a. «есть ошибка»). Я предлагаю посмотреть, чтобы исправить это в первую очередь.

В противном случае вы можете попытаться взломать средство записи GraphML, чтобы не использовать автоматически сгенерированные идентификаторы ключей. Это не будет слишком сложно, но это создает проблемы (например, когда есть класс имени между атрибутами ребра / узла).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]