2016-07-18 13 views
3

Ich habe jQAssistant verwendet, um eine Neo4j-Datenbank mit Informationen über Java-Artefakte zu füllen.Maximieren (Bestellen) von Versionsnummernelementen in der Neo4j-Datenbank

Jetzt möchte ich die neueste Version eines Artefakts finden, das einige Bedingungen erfüllt. Auf den ersten Blick könnte ich max(a.version) für die Versionseigenschaft eines Artefakts verwenden. Artefakt-Versionen sind jedoch nicht nach der üblichen String-Reihenfolge geordnet, aber tatsächlich ist 1.10.0 eine spätere Version als 1.2.0.

Wie kann ich ein benutzerdefiniertes Bestellschema wie das oben beschriebene implementieren oder verwenden?

Antwort

1

Sie könnten Ihre Versionsnummer in 3 separate Attribute (Dur, Moll, Punkt) zerlegen und diese als Integer behalten.

Betrachten Sie die folgenden Daten

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}) 

Wie Sie sehen, wenn Sie und bestellen nach Version suchen sie in alphabetischer Reihenfolge zurückgegeben werden.

Eine Alternative wäre, die Versionsnummern in separaten Attributen als Ganzzahlen zu erhalten.

match (n:Node) 
return n.name, n.version 
order by n.ver_major, n.ver_minor, n.ver_point 

Eine andere Alternative wäre, die Zeichenfolge in Komponentenversionen aufzuteilen und auf diese zu sortieren. toInt ist erforderlich, ansonsten werden die Werte weiterhin als Strings geordnet.

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 
1

Wie wäre es, dass für Versionsnummern (Haupt-, Neben- und Patch) ihre Knoten haben? So etwas Ähnliches:

// 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 *; 

enter image description here

und die gewünschte Abfrage:

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