最大化(排序)Neo4j 数据库中的版本号元素
Maximizing (ordering) version number elements in Neo4j database
我使用 jQAssistant 将有关 java 工件的信息填充到 Neo4j 数据库中。
现在我想找到满足某些条件的神器的最新版本。乍一看,我可以在工件的 属性 版本上使用 max(a.version)
。但是artifact版本并不是按照通常的String顺序来排序的,实际上1.10.0是比1.2.0晚的版本。
我如何实施或使用如上所述的自定义排序方案?
您可以将版本号字符串分解为 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
版本号(主要、次要和补丁)有它们的节点怎么样?类似的东西:
// 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
我使用 jQAssistant 将有关 java 工件的信息填充到 Neo4j 数据库中。
现在我想找到满足某些条件的神器的最新版本。乍一看,我可以在工件的 属性 版本上使用 max(a.version)
。但是artifact版本并不是按照通常的String顺序来排序的,实际上1.10.0是比1.2.0晚的版本。
我如何实施或使用如上所述的自定义排序方案?
您可以将版本号字符串分解为 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
版本号(主要、次要和补丁)有它们的节点怎么样?类似的东西:
// 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