Networkx图中的哪些元素可能成为新4j图的标签?
问题描述
我在networkx中有一个MultiDiGraph,我正在考虑将其导出到new 4j。我已经有了一个名为ntype的节点属性和一个名为dtype的边属性,它符合新4j图的节点和边的标签概念。
来自networkx的哪些元素可能成为新4j的标签?如何管理它?
我添加了一个python图形的示例,以及在导出到ne4j时希望获得的图形。
以下是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导入时想要的图形的ne4j处的代码
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中导出到graph ml,并在ne4j中导入,如下所述enter link description here。我还添加了参数readLabels和store NodeIds。从浏览器:
CALL apoc.import.graphml("test.graphml", {readLabels: true, storeNodeIds:true})
现在我得到了边的标签,但没有得到节点的标签。这是我得到的:
解决方案
我做了一些研究,最后得到了一个能够将网络x图导出到管理标签的新4j图的过程。 必须考虑一些细节:
1.-创建节点时:在ne4j处成为标签的属性必须命名为Labels(请注意,它是复数形式,不要问为什么,它是有效的)。它的值必须是以‘:’开头的字符串
G.add_nodes_from([(1,{'labels':':NUMBER', 'color':'blue'}), ('A',{'labels':':LETTER', 'state':'done'})])
2.-创建边时:要在新4j成为标签的属性必须命名为标签(现在它是单数!!)。它的值必须是以‘:’开头的字符串
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将网络X图导出为Graphml
nx.write_graphml(G, 'test.graphml', named_key_ids=True)
5.-使用参数导入到ne4j读取Labels:true和store NodeIds:true。在ne4j浏览器上,您可能会看到:
CALL apoc.import.graphml("test.graphml", {readLabels: true, storeNodeIds:true})
我在这里包含了一个在networkx中创建的图表,该图表可以导入到ne4j中,如下所述:
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)
有什么待处理的?要弄清楚如何将多个标签放到一个节点或边。欢迎任何帮助
相关文章