Jaký je Tinkerpop ekvivalent Neo4j zápasu / připojit na majetkové hodnoty

hlasů
2

Mám Neo4j Cypherdotaz. Snažím se pochopit, jak to udělat stejný dotaz Tinkerpop/ Gremlin(nikoli Neo4jrealizaci).

start
  f=node:node_auto_index('_Element:field OR _Element:dynamicField'),
  t=node:node_auto_index(_Element = 'fieldType')
where
  f.type=t.name
return
  f, t

V podstatě jsem si dva typy uzlů (etikety / typy / cokoliv) a pokusit se zjistit, kde jeden odkazuje na jiný prostřednictvím zápas hodnoty nemovitosti. Budu pak vytvořit skutečný vztah s využitím výsledků.

Graf není příliš velký, až několik tisíc uzlů.

Položena 08/07/2013 v 18:14
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Jak se něco existuje mnoho způsobů, jak tento přístup. Vzhledem k tomu, máte malý datový soubor, jsem si nemyslel, že by to byl problém dělat vyhledávání přes g.Vuvnitř Gremlin potrubí. Simulovat váš problém, jsem vytvořil svůj vlastní: Použití hračku graf , přidejte sameFirstLetterokraj do nějakého vrcholu, který měl langvlastnost nějakého vrcholu, které měly agemajetek a kde je první písmeno jejich namevlastností byl stejný. V takovém případě by mělo přidat dva vrcholy, z 5 na 4 a od 3 do 4.

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                                                  
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.has('lang').transform{v->[v,g.V.has('age').filter{it.name.startsWith(v.lang[0])}.toList()]}.sideEffect{edgeList->edgeList[1].each{it.each{edgeList[0].addEdge('sameFirstLetter',it)}}}
==>[v[3], [v[4]]]
==>[v[5], [v[4]]]
gremlin> g.E
==>e[1][5-sameFirstLetter->4]
==>e[10][4-created->5]
==>e[0][3-sameFirstLetter->4]
==>e[7][1-knows->2]
==>e[9][1-created->3]
==>e[8][1-knows->4]
==>e[11][4-created->3]
==>e[12][6-created->3]

Existují dva kusy tohoto kódu. První konstruuje seznam sousednosti zápasů a druhý vytváří okraj. Tady je ta část, která se dostane na seznam sousednosti:

g.V.has('lang').transform{v->[v,g.V.has('age').filter{it.name.startsWith(v.lang[0])}.toList()]}

Výše uvedený kód v podstatě říká, urvat všechny vrcholy, které mají langvlastnosti (Všimněte si, že toto použití hasje součástí nejnovější verze Gremlin - brzy být propuštěn 2.4.0 Před 2.4.0 můžete udělat. .hasNot('lang',null)Nebo něco podobného) a potom převést do seznamu, kde první položka v seznamu je langvrchol a druhá položka v seznamu je seznam vrcholů v grafu, které odpovídají na první písmeno names prvním písmenem lang(v tomto případě písmeno jpro oba langvrcholy).

.sideEffect{edgeList->edgeList[1].each{it.each{edgeList[0].addEdge('sameFirstLetter',it)}}}

Výše uvedený sideEffect zpracovává tento výstup ... seznam sousednosti:

==>[v[3], [v[4]]]
==>[v[5], [v[4]]]

Tato operace by mohla být provedena jako samostatný řádek kódu (ne všichni Gremlin musí být napsán v jednom řádku ... jako uspokojující jako to může být). Dalo by se jednoduše uložit seznam sousednosti proměnné pak post-proces je vytvořit okraje. V každém případě jsem se rozhodl použít sideEffecttady, kde jsem smyčka seznam seznamů tvořících hrany, jak jsem jít.

Nebo můžete také dva průchody datovém souboru tím, že staví index v paměti identifikován na základě hodnoty majetku a následně ji využít jako vyhledávání sestavit seznam sousednosti. Tímto způsobem byste trpět jen dvě prochází seznamu vrcholů:

gremlin> m=g.V.groupBy{it.name[0]}{it}.cap.next()
==>v=[v[2]]
==>r=[v[5]]
==>p=[v[6]]
==>l=[v[3]]
==>m=[v[1]]
==>j=[v[4]]
gremlin> g.V.has('lang').transform{[it,m[it.lang[0]]]}
==>[v[3], [v[4]]]
==>[v[5], [v[4]]]

To vás dostane do stejného seznamu přilehlosti jak bylo uvedeno v předchozím příkladu. Vytvoření okraj přes seznam přilehlosti je stále prováděna jak již bylo uvedeno.

Odpovězeno 09/07/2013 v 11:48
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more