我用Neo4j构建了一个遗留代码库的类图。我正在尝试查询在子类中重写的父类的所有方法。
我的节点和关系看起来像这样:
类定义如下:
(c:Class {name: "ClassName"})-[:IS_CHILD_OF]->(p:Class {name: "ParentClassName")
方法定义如下:
(c:Class)-[:HAS]->(m:Method {name: "methodName"})
我对Neo4j没有多少经验,但这是我迄今为止提出的最好的查询:
MATCH (child:Class)-[:HAS]->(m) MATCH (parent:Class)-[:HAS]->(mp) WHERE m.name = mp.name AND child-[:IS_CHILD_OF]->parent RETURN child, parent;
它似乎正在做某事,但这个查询已经运行了一段时间了,我甚至不确定这是否是我正在寻找的结果。有什么指针吗?
答案 0 :(得分:1)
所以,我找到了一个似乎正在给我想要的解决方案。
MATCH (cf:Function)<-[:HAS]-(cc:Class)-[:IS_CHILD_OF*]->(pc:Class)-[:HAS]->(pf:Function)
WHERE cf.name = pf.name
AND cf.scope <> pf.scope
RETURN cc, cf, pc, pf;
答案 1 :(得分:1)
你应该看看http://jqassistant.org开箱即用的所有这一切,它建立在neo4j上,允许你查询和规则。
这可能更有效:
create index on :Method(name);
match (m:Method)
with m, m.name
match (m2:Method {name:name})<-[:HAS]-(child:Class)<-[:IS_CHILD_OF*]-(parent:Class)-[:HAS]->(m)
using index m2:Method(name)
RETURN m.name, child.name, parent.name;