Domanda

Nella mia query di Gremlin, ho quanto segue:

vert.as('x').
both.or(
  _().has("time").filter{ it.time.toInteger() > startTime.toInteger() },
  _().has("isRead"), _().has("isWrite")).dedup().gather.scatter.
store(y).loop('x'){c++ < limit.toInteger()}.iterate();
.

Nella mia scrittura di Gremlin, ritorno a y, ma y chiaramente ha solo vertici in esso. Posso recuperare manualmente ciascuno dei bordi manualmente su di essi per ciascuno dei vertici, ma voglio che un elenco restituito che contiene solo i bordi tra altri nodi restituiti nell'elenco Y.

In particolare, devo essere in grado di ricreare il sottogruppo restituito all'interno di una struttura dati localmente, quindi Gremlin viene utilizzato per restituire tali informazioni. Altri dettagli sulla mia custodia di utilizzo che influenzano queste esigenze sono il fatto che i laterizia manuale su ciascuno dei bordi dei nodi è troppo lenta, dal momento che il server di rexster che esegue il mio script di lampadine su è necessario spingere i dati sul filo, e anche perché Se non ho il set di bordi tra ciascuno dei vertici che è stato originariamente restituito utilizzando lo script, quindi devo controllare ogni vertice incontrata lungo ciascun lato per assicurarsi che sia all'interno del set originariamente restituito; Molto non ideale.

Fondamentalmente, qualsiasi risultato dovrebbe essere tale che, quando guardo a nessuno dei vertici restituiti posso sapere quali vertici sono collegati all'interno del set restituito - senza dover effettere alcun controllo manuale o ricerca. Dovrebbe semplicemente essere nel set di dati.

Modifica 1:

Ho trovato che la capacità dell'albero di Gremlin è stata davvero buona per fare esattamente cosa volevo! Il problema è, ora che uso l'albero, ho bisogno di restituirlo a un modulo che può essere utilizzato ... Posso solo restituire i vertici oi bordi, quindi non posso restituire immediatamente l'albero.

Modifica 2:

Espeed ha ragione; Dovrei usare BORE per iniziare. Ma ho alcune condizioni che voglio soddisfare ... quasi l'ho avuto prima, ma non ho potuto ottenere il filtro per funzionare correttamente.

vert.as('l').
bothE.gather.scatter.as('edge').bothV.or(
  _().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger() },
  _().has("isRead"), _().has("isWrite")).
dedup().store(results).as('vertice').back('edge').store(results).back('vertice')
.loop('l'){c++ < limit.toInteger()}.iterate();
.

Non capisco perché non riesco a usare due dorsi in una pipeline (ottengo un NullPointerException con questo). Il problema di base che voglio risolvere è: fai una primissima ricerca, memorizzando solo i nodi che soddisfano tutto il o sopra, e memorizza i bordi tra tutti i vertici che passano il test.

È stato utile?

Soluzione

Senza scherzare con il tuo codice, forse la cosa più semplice è fare:

results = [] as Set
vert.as('l').
bothE.as('e').gather.scatter.as('edge').bothV.or(
  _().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger()}.store(results),
  _().has("isRead"), _().has("isWrite")).store(results))
.sideEffect{e,m->results<<m.e}
.loop('l'){c++ < limit.toInteger()}.iterate();
.

Nota che dichiarando i risultati come Set è possibile evitare il passaggio dedup.In sostanza conservare i vertici mentre li filtra nel passaggio or.

Altri suggerimenti

Utilizzare bothE() anziché both() per accedere ai bordi ...

Vedi http://gremlindocs.com/#transform/bothe

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top