首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost GraphML格式

Boost GraphML格式
EN

Stack Overflow用户
提问于 2018-04-10 03:20:15
回答 1查看 169关注 0票数 2

有人能解释一下Boost使用的GraphML格式吗?它包含其他GraphML编写者不使用的间接性级别。我已经包含了来自两个来源的GraphML输出,它们都来自相同的输入数据。我不明白为什么Boost似乎在“key0-N”关键字中使用了额外的间接性。任何有说服力的解释都是非常值得赞赏的。

我正在寻找一种方法来配置Boost,以生成与Java/Tinkerpop生成的输出相似或相同的输出,如下面的第一个示例所示。我想消除“key0-N”的间接性。

首先,下面是使用TinkerPop图形库的Java程序产生的输出:

代码语言:javascript
复制
    <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>

下面是我使用Boost图形库中的C++ write_graphml()函数时显示的相同数据:

代码语言:javascript
复制
    <?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时会抛出异常:

代码语言:javascript
复制
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”。

需要注意的是,如果我使用的是内存中的Tinkergraph,那么Tinkerpop会很好地加载原始的GraphML。只有当我使用JanusGraph作为底层DB时,才会发生异常。

EN

回答 1

Stack Overflow用户

发布于 2018-04-10 03:49:57

我正在寻找一种方法来配置Boost,以产生与

/Tinkerpop产生的输出相似或相同的输出,如下面的第一个示例所示。我想消除“key0-N”的间接性。

你把自己搞糊涂了。TinkerPop输出具有完全相同的间接性。唯一的区别是TinkerPop确定它知道节点和边缘数据键的is是相同的。

读取XML的工具没有任何区别。

事实上,即使是以下内容也是等效的:

代码语言:javascript
复制
<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>

与以下内容没有区别:

代码语言:javascript
复制
<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的工具是基于错误的假设进行编程的,那么您可能会陷入困境。“有一个bug")。我建议先解决这个问题。

否则,您可以尝试破解GraphML编写器,使其不使用自动生成的密钥ids。这不会太难,但它确实会带来麻烦(例如,当边/节点属性之间有一个name类时)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49740173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档