Question

Dans mon gremlin requête, j'ai le texte suivant:

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();

Dans mon gremlin script, je retourne y, mais y a clairement a seulement sommets en elle.Je peux récupérer manuellement chacun des bords manuellement par l'itération sur eux pour chacun des sommets, mais je veux une liste retournée qui contient uniquement les bords entre autres nœuds renvoyées dans la liste y de la.

En particulier, j'ai besoin d'être en mesure de recréer le sous-graphe retourné à l'intérieur d'une structure de données localement, gremlin est utilisé pour renvoyer cette information.D'autres détails à propos de mon cas d'utilisation que l'influence de ces besoins sont le fait que manuellement une itération sur chacun des nœuds arêtes est trop lent, depuis le rexster serveur, je suis en cours d'exécution mes ampoules script a qu'à pousser les données sur le fil, et aussi parce que si je n'ai pas l'ensemble des arêtes entre les sommets qui ont été renvoyés en utilisant le script, puis-je vérifier chaque vertice rencontrés le long de chaque bord pour s'assurer qu'il est dans l'ensemble à l'origine du retour;très non-idéal.

Fondamentalement, tout résultat doit être telle que, quand je regarde toute de retour des sommets que je puisse savoir ce que les sommets sont liés à l'intérieur du retournés ensemble, sans avoir à le faire de n'importe quel manuel de la vérification ou de recherche.Elle devrait simplement être dans le jeu de données.

EDIT 1:

J'ai trouvé que gremlin de l'arbre du pipeline de la capacité a été vraiment bon pour faire exactement ce que je voulais!Le problème est que, maintenant que j'utilise de l'arbre, j'ai besoin de retourner à une forme qui peut être utilisé...Je ne peux que renvoyer des sommets ou des arêtes, donc je ne peux pas retourner arbre tout de suite.

EDIT 2:

espeed est droit;Je dois utiliser les utilisent pour commencer.Mais j'ai quelques conditions que je veux satisfaire...J'ai presque eu plus tôt, mais je ne pouvais pas le filtre fonctionne correctement.

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();

Je ne comprends pas pourquoi je ne peux pas utiliser deux dos dans un pipeline (j'ai une NullPointerException avec celui-ci).Le problème que je veux résoudre est:faire une largeur de recherche, en ne stockant que les nœuds qui satisfont à toutes les ou au-dessus, et de stocker les bords entre tous les sommets de passer le test.

Était-ce utile?

La solution

Sans déconner avec votre code de trop, peut-être la chose la plus facile est de le faire:

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();

Notez que la déclaration des résultats comme Set vous pouvez éviter l' dedup étape.Fondamentalement stocker les sommets comme vous le filtre dans le or étape.

Autres conseils

Utilisation bothE() au lieu de both() pour accéder aux bords de la...

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top