Q1-应用A的方法 methodA,调用了应用B的方法 methodB。帮我生成 neo4j 的数据关系和节点的 插入语句。
在这种情况下,我们可以创建两个应用节点(应用A和应用B)以及两个方法节点(methodA和methodB)。
然后,我们可以创建一个调用关系,从应用A的methodA方法指向应用B的methodB方法。
以下是插入这些节点和关系的Neo4j Cypher语句:
清空
MATCH (n) DETACH DELETE n;
DETACH DELETE 是一个组合操作,它会删除节点,同时删除所有连接到这些节点的关系,而不会删除关系的另一端节点。
查询
作为入口:
match p=(startM)-[r:METHOD_CALLS]->(endM)
where (r.endMethodFullName='appD,methodD1')
return startM, r, endM
作为出口:
match p=(startM)-[r:METHOD_CALLS]->(endM)
where (r.startMethodFullName='appD,methodD1')
return startM, r, endM
必须要有方向性。
match p=(startM)-[r:METHOD_CALLS]->(endM)
where (r.startMethodFullName='appD,methodD1')
return r
过滤
MATCH p=(startM)-[r:METHOD_CALLS]->(endM)
where r.tid='T0001'
RETURN startM, r, endM
LIMIT 1000
根据节点直接查询
MATCH (n)-[r]-(m)
WHERE ID(n) = node_id
RETURN r
操作
应用与方法
// 创建应用节点
CREATE (appA:Application {name: '应用A', id:'appA'});
CREATE (appB:Application {name: '应用B', id:'appB'});
CREATE (appC:Application {name: '应用C', id:'appC'});
// 创建方法节点
CREATE (methodA:Method {name: 'appA-methodA', id: 'methodA', app: 'appA'});
CREATE (methodB:Method {name: 'appB-methodB', id: 'methodB', app: 'appB'});
CREATE (methodC1:Method {name: 'appC-methodC1', id: 'methodC1', app: 'appC'});
CREATE (methodC2:Method {name: 'appC-methodC2', id: 'methodC2', app: 'appC'});
// 创建所属关系
MATCH (node1:Method), (node2:Application)
WHERE node1.id = 'methodA' AND node2.id = 'appA'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Method), (node2:Application)
WHERE node1.id = 'methodB' AND node2.id = 'appB'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Method), (node2:Application)
WHERE node1.id = 'methodC1' AND node2.id = 'appC'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Method), (node2:Application)
WHERE node1.id = 'methodC2' AND node2.id = 'appC'
CREATE (node1)-[:REF]->(node2);
// 创建 chain 节点
CREATE (chain1:Chain {name: 'appA-methodA-chain1', id:'chain1', method: 'methodA'});
CREATE (chain2:Chain {name: 'appB-methodB-chain2', id:'chain2', method: 'methodB'});
CREATE (chain3:Chain {name: 'appC-methodC1-chain3', id:'chain3', method: 'methodC1'});
CREATE (chain4:Chain {name: 'appC-methodC2-chain4', id:'chain4', method: 'methodC2'});
// 链路的从属关系
MATCH (node1:Chain), (node2:Method)
WHERE node1.id = 'chain1' AND node2.id = 'methodA'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Chain), (node2:Method)
WHERE node1.id = 'chain2' AND node2.id = 'methodB'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Chain), (node2:Method)
WHERE node1.id = 'chain3' AND node2.id = 'methodC1'
CREATE (node1)-[:REF]->(node2);
MATCH (node1:Chain), (node2:Method)
WHERE node1.id = 'chain4' AND node2.id = 'methodC2'
CREATE (node1)-[:REF]->(node2);
// 链路的调用关系
MATCH (node1:Chain), (node2:Chain)
WHERE node1.id = 'chain1' AND node2.id = 'chain2'
CREATE (node1)-[:CALLS]->(node2);
MATCH (node1:Chain), (node2:Chain)
WHERE node1.id = 'chain2' AND node2.id = 'chain3'
CREATE (node1)-[:CALLS]->(node2);
MATCH (node1:Chain), (node2:Chain)
WHERE node1.id = 'chain2' AND node2.id = 'chain4'
CREATE (node1)-[:CALLS]->(node2);
这个模型假设每个方法都属于一个应用,并且我们用一个CALLS关系表示一个方法调用另一个方法。
你可以根据你的具体需求调整这个模型。
例如,如果一个方法可以调用多个其他方法,或者一个方法可以被多个方法调用,你可能需要调整这个模型以反映这些情况。
method-scene 设计
scene
sceneCode 编码
sceneName 名称
sceneRemark 备注
method
固定的属性
appName: 应用名称
methodName: 方法全称(唯一索引)
methodType: 方法类别 DAL/WEB/SERVICE
主要考虑方法,不先关注场景/APP 的从属关系。
链路假设
简单,为了便于分析。指定两条不同的链路。
TODO:…
小结
基本的关系创建实例。