ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-如何使用Neo4j Reactivity驱动程序发布/订阅Meteor

2019-10-28 00:37:15  阅读:230  来源: 互联网

标签:neo4j meteor reactive-programming master-slave javascript


我正在使用Meteor应用程序,您可以在其中创建Neo4j“ Room”节点和“ DOOR”关系.每个房间只能有一个通往其他房间的门.

我正在使用Dmitriy Aristarkhovich的Neo4j Reactivity驱动程序.

我想创建一个实时的主从系统,其中用户做出的选择会影响其他可能的选择.

为了说明这一点,在端口7474上的Neo4j浏览器中,我创建了一个简单的房间网络,如下所示:

CREATE
(a:Room {name: "Room 1"})
-[:DOOR]->
(b:Room {name: "Room 2"}),
a-[:DOOR]->
(c:Room {name: "Room 3"}),
b-[:DOOR]->a
RETURN a, b, c

Rooms and doors

在此架构中:

> 1号房已经拥有它可以拥有的所有出门
> 2号房间可以通过门链接到3号房间
> 3号房间可以同时链接到1号房间和2号房间

我想显示两个下拉菜单:

>主菜单选择门的起步室
>从属菜单,从给定起始房间的可能的结束房间中进行选择.

这是我用来创建这些菜单的流星风味HTML:

<body>
  {{> addDoor}}
</body>

<template name="addDoor">
  <p>Add a Door from
    <select id="fromRoomName">
      {{#each fromRooms}}
        {{> fromRoom}}
      {{/each}}
    </select>

    to: 
    <select id="toRoomName">
      {{#each toRooms}}
        {{> toRoom}}
      {{/each}}
    </select>
  </p>
</template>

<template name="fromRoom">
  <option value="{{name}}">{{name}}</option>
</template>

<template name="toRoom">
  <option value="{{name}}">{{name}}</option>
</template>

在主菜单中选择Room 3时,这些菜单应该是这样.

Master-slave menus

这是我正在使用的JavaScript:

var queries = {
  "roomsForNewDoors": {
    collection: Meteor.neo4j.collection("RoomsForNewDoors")
  , query: 
     "MATCH (entrance:Room), (exit:Room) " +
     "WHERE NOT (entrance)-[:DOOR]->(exit) " +
     "AND entrance <> exit " +
     "RETURN entrance"
  , link: "entrance"
  }
, "newDoorsForRoom": {
    collection: Meteor.neo4j.collection("NewDoorsForRoom")
  , query: 
      "MATCH (entrance:Room), (exit:Room) " +
      "WHERE entrance.name = '{name}' " +
      "AND NOT (entrance)-[:DOOR]->(exit) " +
      "AND entrance <> exit " +
      "RETURN exit"
  , options: {name: "Room 2"}
  , link: "exit"
  }
}


if (Meteor.isServer) {
  ;(function (){
    var queryKeys = Object.keys(queries)
    queryKeys.forEach(publish)

    function publish(key) {
      var queryData = queries[key]
      var query = queryData.query
      var collection = queryData.collection

      collection.publish(key, publishCallback)

      function publishCallback(){
        return query
      }
    }
  })()
}


if (Meteor.isClient) {
  Tracker.autorun(function createSubscriptions(){
    var queryKeys = Object.keys(queries)
    queryKeys.forEach(subscribe)

    function subscribe(key) { //, index, array){
      var queryData = queries[key]
      var options = queryData.options
      var link = queryData.link
      var collection = queryData.collection
      var subscription = collection.subscribe(key, options, link)
    }
  })

  function getResults(queryData) {
    var collection = queryData.collection
    var cursor = collection.find()
    return cursor
  }

  Template.addDoor.events({
    'change #fromRoomName': function () {
      var fromRoomId = $("#fromRoomName :selected").text()
      Session.set("fromRoomId", fromRoomId)
    }
  })

  Template.addDoor.helpers({
    fromRooms: function() {
      var results = getResults(queries.roomsForNewDoors)
      return results
    }

  , toRooms: function () {
      var key = "newDoorsForRoom"
      var queryData = queries[key]
      var options = { name: Session.get("fromRoomId") }
      var link = queryData.link
      var collection = queryData.collection
      collection.subscribe(key, options, link)

      var results = getResults(queryData)
      return results
    }
  })
}

当我在Neo4j浏览器中测试两个MATCH查询时(例如,使用“ Room 2”而不是“ {name}”),我得到的正是我期望的结果.使用Neo4j Reactivity驱动程序,第一个MATCH查询运行良好,但是第二个查询会产生一组空结果.

我怀疑我不了解发布/订阅过程的一些基本知识.我将不胜感激能使该功能正常工作.

完整的项目在这里可用:

git clone git@github.com:blackslate/Neo4j-issues.git

解决方法:

这可能不是发布/订阅问题.尝试删除{name}参数周围的引号.

也就是说,更改:

"WHERE entrance.name = '{name}' "

至:

"WHERE entrance.name = {name} ".

标签:neo4j,meteor,reactive-programming,master-slave,javascript
来源: https://codeday.me/bug/20191027/1948326.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有