networkx 图中的哪些元素可能成为 neo4j 图中的标签?

Which elements from networkx graph might become labels at neo4j graph?

我在 networkx 中有一个 MultiDiGraph,我正在考虑将它导出到 neo4j。我已经有一个 属性 用于称为 ntype 的节点和一个 属性 用于称为 dtype 的边,它符合 neo4j 图的节点和边的标签概念。

networkx 中的哪些元素可能成为 neo4j 的标签?如何管理?

我在 python 添加了一个图表示例,以及我希望在导出到 neo4j 时获得的图表。

这是 python

处的代码
import networkx as nx

G=nx.MultiDiGraph()

G.add_nodes_from([
    (1,{'ntype':'NUMBER', 'color':'blue'}),
    (2,{'ntype':'NUMBER', 'color':'yellow'}),
    ('A',{'ntype':'LETTER', 'state':'done'}),
    ('B',{'ntype':'LETTER', 'state':'pending'})
    ])
G.add_edges_from([
    (1,'A','dir',{'etype':'IMPACTS', 'when':'old'}),
    (1,'A','n_dir',{'etype':'IMPACTS', 'when':'new'}),
    (1,'B','n_dir',{'etype':'ALTS', 'when':'future'}),
    (2,'B','dir',{'etype':'IMPACTS', 'when':'new'}),
    (2,'B','n_dir',{'etype':'IMPACTS', 'when':'old'}),
    (2,'A','n_dir',{'etype':'ALTS', 'when':'new'}),
    ])

这是从 networkx 导入时我想要的图的 neo4j 代码

CREATE (one:NUMBER {name:1, color:'blue'})
CREATE (two:NUMBER {name:2, color:'yellow'})
CREATE (A:LETTER {name:'A', state:'done'})
CREATE (B:LETTER {name:'B', state:'pending'})
CREATE (one)-[:IMPACTS {k:'dir', when:'old'}]->(A)
CREATE (one)-[:IMPACTS {k:'n_dir', when:'new'}]->(A)
CREATE (one)-[:IMPACTS {k:'n_dir', when:'future'}]->(B)
CREATE (two)-[:ALTS {k:'dir', when:'new'}]->(B)
CREATE (two)-[:IMPACTS {k:'n_dir', when:'old'}]->(B)
CREATE (two)-[:ALTS {k:'n_dir', when:'new'}]->(A)

我已经尝试在 networkx 中导出到 graphml,并按照此处所述在 neo4j 中导入 enter link description here。我还添加了参数 readLabelsstoreNodeIds。来自浏览器:

CALL apoc.import.graphml("test.graphml", {readLabels: true, storeNodeIds:true})

现在我得到了边的标签,但我没有得到节点的标签。这是我得到的:

我做了一些研究,最后我得到了一个能够将 networkx 图导出到管理标签的 neo4j 图的过程。 必须考虑一些细节:

1.- 创建节点时: 属性 成为neo4j的标签必须是命名为labels(注意是复数形式,不要问为什么,可以用)。它的值必须是以':'

开头的字符串
G.add_nodes_from([(1,{'labels':':NUMBER', 'color':'blue'}), ('A',{'labels':':LETTER', 'state':'done'})])

2.- 创建边时: 属性 成为neo4j的标签必须是命名为label(现在是单数!!)。它的值必须是以':'

开头的字符串
G.add_edges_from([(1,'A','dir',{'label':'IMPACTS', 'when':'old'})])

3.- 对于 MultiDiGraph 不会导入 k 值。我的解决方法是 复制 k 作为边 属性 调用,例如 id

for u,v,k in G.edges(keys=True):
G[u][v][k]['id']=k

4.- 使用 named_key_ids=True

将 networkx 图导出到 graphml
nx.write_graphml(G, 'test.graphml', named_key_ids=True)

5.- 使用参数 readLabels: truestoreNodeIds:true 导入到 neo4j。在 neo4j 浏览器中你可能有:

CALL apoc.import.graphml("test.graphml", {readLabels: true, storeNodeIds:true})

这里我包含了一个在 networkx 中创建的图表,可以按照描述将其导入到 neo4j 中:

import networkx as nx

G=nx.MultiDiGraph()

#creation of nodes with property called 'labels'
G.add_nodes_from([
    (1,{'labels':':NUMBER', 'color':'blue'}),
    (2,{'labels':':NUMBER', 'color':'yellow'}),
    ('A',{'labels':':LETTER', 'state':'done'}),
    ('B',{'labels':':LETTER', 'state':'pending'})
    ])
#creation of edges with property called 'label'
G.add_edges_from([
    (1,'A','dir',{'label':'IMPACTS', 'when':'old'}),
    (1,'A','n_dir',{'label':'IMPACTS', 'when':'new'}),
    (1,'B','n_dir',{'label':'ALTS', 'when':'future'}),
    (2,'B','dir',{'label':'IMPACTS', 'when':'new'}),
    (2,'B','n_dir',{'label':'IMPACTS', 'when':'old'}),
    (2,'A','n_dir',{'label':'ALTS', 'when':'new'}),
    ])
#k is duplicated at every node as a property
for u,v,k in G.edges(keys=True):
    G[u][v][k]['id']=k

nx.write_graphml(G, 'test.graphml', named_key_ids=True)

什么是未决的?弄清楚如何为一个节点或一条边分配多个标签。欢迎任何帮助