Skip to content

Instantly share code, notes, and snippets.

@almereyda
Created April 28, 2014 02:48
Show Gist options
  • Save almereyda/11360637 to your computer and use it in GitHub Desktop.
Save almereyda/11360637 to your computer and use it in GitHub Desktop.
Kurzbeschreibung zum Stand Daniels Prototypen

28.04.2014 : 04:12 : Fork von http://text.allmende.io/p/Kurzbeschreibung_zum_Stand_meines_Prototypen_%28DJ%29 durch @almereyda (yala) zur Formatierung und Kommentierung


@jonrichter @onyourway Bin mit meinem Prototypen noch am basteln, da ich den nicht nur für unsere OSM-Geschichte benutzen möchte.

Es ist momentan nicht dazu verwendbar, Daten bei OSM einzugeben, sondern speichert alles in einen Tripel-Graphen (wie RDF, wobei ich das jetzt nicht explizit nutze da mich die URI-Schreibweise beim testen stört). Von dort aus kann man aber beliebige Adapter anflanschen. Beim Bau des Adapters lässt man sich natürlich von bereits vorhandenen Sachen wie osmhydrant inspirieren.

Momentan verwende ich noch eine MySQL-DB als Backend da mir das einfacher zu bauen war als mit der Couch. Somit besteht der Prototyp momentan noch eher aus Stored-Procedures denn einer richtigen Eingabemaske.

Ein Javascript-Frontend dafür lässt sich aber sicherlich im Rahmen des OuiShare Labs Camp fertigstellen.


Zur Abfragesprache und API:

Ich denke da momentan an SPARQL... bin aber gerade auch mit Prolog zu Gange welches für diese Art von Aufgabenstellungen sehr vielversprechend aussieht (ohnehin sehr ähnlich, nur mächtiger).

yala : @kpraetor hat damit Erfahrungen

Im Frontend muss dann allerdings ein Generator dafür zur Verfügung stehen damit man das auch bedienen kann :-)

Die API wird dementsprechend simpel: Eine Methode ProcessRequest o.ä. zum Eintragen, Verknüpfen und Abfragen von Objekten die einen JSON-String entgegen nimmt.

Die eigentliche Eingabemaske wird aus dem Schema des Graphen generiert.
Das Schema ist dabei nicht fix, sondern wird nach folgendem Verfahren gebildet:

  • 1) Man sucht sich einen Einstiegspunkt wie z.B.: "Ich möchte eine Person eintragen"

  • 2) Es wird abgefragt welche Beziehungstypen es für eine "Person" bereits gibt. Das könnten z.B. sein:

  • "Person"-is-a->"Male"

    • lies: "Es gibt mind. eine Person, die ein Mann ist",
  • "Person"-is-a->"Female"

    • lies: "Es gibt mind. eine Person, die eine Frau ist",
  • "Person"-has-a-birthdate->"21.02.1982"

    • lies: "Es gibt mind. eine Person, die am 21.02.1982 Geburtstag hat",
  • "Person"-has-a-birthdate->"24.12.1975"

    • lies: "Es gibt mind. eine Person, die am 24.12.1975 Geburtstag hat",
  • "Person"-is-named->"Daniel"

    • lies: "Es gibt mind. eine Person, die Daniel heisst",
  • "Person"-lives-in->"Munich"

    • lies: "Es gibt mind. eine Person, die in München wohnt",
  • "Person"-lives-in->"Vienna"

    • lies: "Es gibt mind. eine Person, die in Wien wohnt"
  • 3) Aus den Prädikaten und Objekten wird die Eingabemaske erzeugt, wobei das Prädikat die Feldbeschriftung und die gefundenen Objekte die möglichen Werte darstellen.


Das Ergebnis könnte folgendermaßen aussehen:

  • Neue Person
  •      ```Name``` `:` `"Neuer Name"`
    
  • Geschlecht : "Mann"|"Frau"|Neu(es Geschlecht, zugegebenermaßen etwas utopisch ;) > ein Textfeld ist eine gängige alternative : yala
  •      `Geburtstag` `:` `"21.02.1982"|"24.12.1975"|Neu`(es Datum)
    
  •      `Wohnort` `:` `"München"|"Wien"|Neu`(er Ort)
    

Das ist jetzt eine etwas vereinfachte Darstellung des Ablaufs, da ja ein Name, Ort oder ein Datum wiederum Verknüpfungen aufweisen die sie genauer beschreiben.


Abfragen würde man das ganze dann folgendermaßen:

  • "X"-lives-in->"Vienna"
    • lies: Gib mir alle X (i.d.R. Personen) die in Wien leben
    • explizit für Personen: "X"-lives-in->"Vienna" AND ("X"-is-a->"Male" OR "X"-is-a->"Female")
  • oder
  • "X"-lives-in->"Vienna" AND "X"-is-a->"Person"
  • wobei hier wieder ein wenig mehr Komplexität im Spiel ist, da man sich hier je nach dem wie die Daten verknüpft sind wieder über weitere Knoten hangeln muss, Prolog und die SPARQL-Implementierungen erschlagen das allerdings bereits. Der konkrete Weg in meinem Modell wäre hier z.B.
    • "X"-is-a->"Male", "Male"-is-a->"Person" daraus folgt "X"-is-a->"Person"
  • "X"-lives-in->"Y"
  • lies: "Gib mir alle X (i.d.R. Personen), die in Y (i.d.R. Orte) leben" oder "Gib mir alles was irgendwo lebt"
  • "X"-has-a-birthdate->"24.12.1975"
  • lies: "Gib mir alle X die am 24.12.1975 Geburtstag haben"

also eig. wie SPARQL oder eben Prolog...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment