2017-07-26 3 views
2

Ich habe folgendes Datenmodell:Cypher Abfrage mit ORDER BY auf Übersetzung mit dem Rückfall

  • Knoten Entität BusinessObject
  • Knoten Entität Translation enthaltend ein language und eine text Eigenschaft
  • Beziehung TRANSLATES von Übersetzung des Geschäftsobjekt, möglicherweise mehrere

Die Übersetzungen allo Ich möchte Texte präsentieren, die der Sprache des Benutzers entsprechen. Ein Benutzer kann beispielsweise Deutsch lesen, ein Geschäftsobjekt wird in Englisch und Deutsch übersetzt, und auf der Benutzeroberfläche wird Deutsch angezeigt. Im Allgemeinen gibt es einen Rückfall von der Sprache des Benutzers zu einer Standardsprache (Englisch).

Jetzt möchte ich für alle BusinessObject s abfragen und sie nach der Übersetzung bestellen, die den Fallback enthalten sollte. Ist das mit der Chiffre überhaupt möglich?

EDIT: Beispiel

Businessobject A mit Übersetzungen ("en", "XYZ Übersetzung für A") und ("de", "Deutsche Übersetzung für A").

BusinessObject B mit Übersetzungen ("en", "Einige englische Übersetzung für B") und ("fr", "Traduction français pour B").

Ein Benutzer U1 hat Sprache Deutsch ("de") und der Fallback sollte Englisch ("en") sein. Die Abfrage von Geschäftsobjekten sollte daher zu einer Liste [A, B] führen, da die Übersetzung "Deutsch ... für A" vor "Some En ... for B" lexikografisch bei der aufsteigenden Sortierung steht. Wenn andererseits ein zweiter Benutzer U2 Sprache Französisch hat, sollte das Ergebnis [B, A] sein, weil "Traduc ... pour B" vor "XYZ Eng ... for A" steht. Ein dritter englischer Benutzer U3 sollte das Ergebnis [B, A] erhalten, weil die Übersetzung "Einige ... für B" vor "XYZ ... für A" steht.

Also ich brauche wirklich die Bestellung von der Datenbank getan, wenn das möglich ist.

EDIT: Lösung

Mit den großen Ideen aus den Antworten, kam ich auf die folgende Abfrage auf:

MATCH (r:BusinessObject) 
WITH r 
OPTIONAL MATCH (r)<-[TRANSLATES]-(t:Translation) 
WHERE t.language = 'de' // user language 
WITH r, t.text as t1 
OPTIONAL MATCH (r)<-[TRANSLATES]-(t:Translation) 
WHERE t.language = 'en' // fallback 
WITH r, coalesce(t1, t.text) as sort 
RETURN DISTINCT r ORDER BY sort; 

Sicherlich hat dies nicht die beste Leistung, aber das ist für mich ok. Danke an alle Mitwirkenden!

+0

Können Sie Eingaben teilen und ein Beispiel für die gewünschte Ausgabe und jeden Versuch, den Sie bisher bei einer Abfrage gemacht haben? – InverseFalcon

Antwort

2

Ich weiß nicht, einen Weg, um die ORDER BY so zu setzen.Aber kurz davor, eine Antwort dafür zu finden, wenn es existiert, könnte eine andere Option sein, Ihr Fallback separat zurückzugeben.

WITH "English" as fallback 
MATCH (b: BusinessObject)-[:TRANSLATES]-(FBTr: Translation) 
WHERE Translation.language = fallback 
WITH fallback, FBTr, b 
MATCH (b)-[:TRANSLATES]-(tr: Translation) 
WHERE Translation.language <> fallback 
RETURN collect(tr) as Translations, FBTr as Fallback 

EDIT
Hier ist ein einfacher Gedanke, nach Sprache sortiert, die Ausweich setzen letzte:

WITH 'English' as Fallback 
MATCH (b:BusinessObject)-[:TRANSLATES]-(t) 
WITH t, CASE t.language 
    WHEN Fallback THEN -1 
    ELSE 0 
END as sort 
RETURN t ORDER by sort DESC, t.language 

Vielleicht ist näher an, was Sie suchen.

+0

Ich brauche wirklich die 'ORDER BY' einschließlich der Fallback. –

+0

@SteffenHarbich, Ich habe eine Bearbeitung hinzugefügt, die das macht, was ich * denke *, wonach du suchst. –

+0

Danke! Siehe meine Bearbeitung für die letzte Abfrage. –

2

Sie können OPTIONAL MATCH mit Coalesce zu tun, was Sie wollen.

MATCH (b:BusinessObject) 
OPTIONAL MATCH (b)-[:TRANSLATES]-(t:Translation) 
RETURN coalesce(t.language,'English') 
+0

Wird nur die Zeichenfolge 'Englisch' oder der englische Übersetzungsknoten zurückgegeben? –

+0

Ich möchte es nach der Übersetzung bestellen lassen, also passt das nicht wirklich zu meiner Frage. Auch dies würde die Sprache und nicht die Übersetzung zurückgeben. –

Verwandte Themen