我使用 jQAssistant 来填充 Neo4j 数据库,其中包含有关 Java 工件的信息。
现在我想找到一些满足某些条件的工件的最新版本。乍一看,我可以max(a.version)
在工件的版本属性上使用。但是工件版本不是按通常的 String 顺序排序的,而是实际上 1.10.0 是比 1.2.0 更新的版本。
我如何实施或使用如上所述的自定义订购方案?
我使用 jQAssistant 来填充 Neo4j 数据库,其中包含有关 Java 工件的信息。
现在我想找到一些满足某些条件的工件的最新版本。乍一看,我可以max(a.version)
在工件的版本属性上使用。但是工件版本不是按通常的 String 顺序排序的,而是实际上 1.10.0 是比 1.2.0 更新的版本。
我如何实施或使用如上所述的自定义订购方案?
版本号(主要、次要和补丁)如何拥有它们的节点?像这样的东西:
// Major
MERGE (M0:Semver:Major {v: 0})
MERGE (M1:Semver:Major {v: 1})
// Minor
MERGE (Mi0: Semver:Minor {v: 0 })
MERGE (Mi2: Semver:Minor {v: 2 })
MERGE (Mi10:Semver:Minor {v: 10})
// Patch
MERGE (P0:Semver:Patch {v:0})
MERGE (P2:Semver:Patch {v:2})
// Artifacts
MERGE (A1:Artifact {name:'Artifact 13afd'})
MERGE (A2:Artifact {name:'Artifact asdfk'})
MERGE (A3:Artifact {name:'Artifact 09sd2'})
MERGE (A4:Artifact {name:'Artifact skw30'})
// Versioning
MERGE (A1)-[:semver]->(M0) MERGE (A1)-[:semver]->(Mi0 ) MERGE (A1)-[:semver]->(P0)
MERGE (A2)-[:semver]->(M0) MERGE (A2)-[:semver]->(Mi0 ) MERGE (A2)-[:semver]->(P2)
MERGE (A3)-[:semver]->(M1) MERGE (A3)-[:semver]->(Mi2 ) MERGE (A3)-[:semver]->(P0)
MERGE (A4)-[:semver]->(M1) MERGE (A4)-[:semver]->(Mi10) MERGE (A4)-[:semver]->(P0)
RETURN *;
以及所需的查询:
MATCH (A:Artifact)-[:semver]->(Mj:Semver:Major),
(A )-[:semver]->(Mi:Semver:Minor),
(A )-[:semver]->(Pt:Semver:Patch)
RETURN A.name, Mj.v, Mi.v, Pt.v
ORDER BY Mj.v asc, Mi.v asc, Pt.v asc
您可以将版本号字符串分解为 3 个单独的属性(主要、次要、点)并将每个属性保留为整数。
考虑以下数据
create (n:Node {name: 'first',version: '1.2.0', ver_major: 1, ver_minor: 2, ver_point: 0})
create (n:Node {name: 'second',version: '1.10.0', ver_major: 1, ver_minor: 10, ver_point: 0})
如您所见,如果您搜索并按版本排序,它们会按字母顺序返回。
match (n:Node)
return n.name, n.version
order by n.version
一种替代方法是将版本号作为整数保存在单独的属性中。
match (n:Node)
return n.name, n.version
order by n.ver_major, n.ver_minor, n.ver_point
另一种选择是将字符串拆分为组件版本并对其进行排序。toInt
是必需的,否则这些值仍将按字符串排序。
match (n:Node)
return n.name
, n.version
, toInt(split(n.version,'.')[0]) as major
, toInt(split(n.version,'.')[1]) as minor
, toInt(split(n.version,'.')[2]) as point
order by major, minor, point