add search bar
This commit is contained in:
parent
0765b7a7c7
commit
6fe346c9a6
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"database": "playground3",
|
"database": "play",
|
||||||
"endpoint": "https://cloud.terminusdb.com/Myseelia/",
|
"endpoint": "https://cloud.terminusdb.com/Myseelia/",
|
||||||
"team": "Myseelia",
|
"team": "Myseelia",
|
||||||
"use JWT token": true
|
"use JWT token": true
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,23 @@ from datetime import datetime
|
||||||
import pytz
|
import pytz
|
||||||
import re
|
import re
|
||||||
import emoji
|
import emoji
|
||||||
|
import json
|
||||||
|
import meilisearch
|
||||||
|
import ast
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
|
||||||
# we keep all the information in dictionaries with Employee id as keys
|
# we keep all the information in dictionaries with Employee id as keys
|
||||||
orgs = {}
|
orgs = {}
|
||||||
|
orgsjson = []
|
||||||
|
|
||||||
client = WOQLClient("https://cloud.terminusdb.com/Myseelia/")
|
client = WOQLClient("https://cloud.terminusdb.com/Myseelia/")
|
||||||
client.connect(db="playground3", team="Myseelia", use_token=True)
|
client.connect(db="play", team="Myseelia", use_token=True)
|
||||||
|
|
||||||
import re
|
client1 = meilisearch.Client(
|
||||||
|
'https://ms-9ea4a96f02a8-1969.sfo.meilisearch.io', '117c691a34b21a6651798479ebffd181eb276958')
|
||||||
|
|
||||||
|
index = client1.index('orgs')
|
||||||
|
|
||||||
def get_emoji_regexp():
|
def get_emoji_regexp():
|
||||||
# Sort emoji by length to make sure multi-character emojis are
|
# Sort emoji by length to make sure multi-character emojis are
|
||||||
|
|
@ -23,9 +31,44 @@ def get_emoji_regexp():
|
||||||
pattern = u'(' + u'|'.join(re.escape(u) for u in emojis) + u')'
|
pattern = u'(' + u'|'.join(re.escape(u) for u in emojis) + u')'
|
||||||
return re.compile(pattern)
|
return re.compile(pattern)
|
||||||
|
|
||||||
|
|
||||||
def remove_emojis(string):
|
def remove_emojis(string):
|
||||||
return get_emoji_regexp().sub(r'', string)
|
return get_emoji_regexp().sub(r'', string)
|
||||||
|
|
||||||
|
def hash_string(string):
|
||||||
|
sha256 = hashlib.sha256()
|
||||||
|
sha256.update(string.encode('utf-8'))
|
||||||
|
return sha256.hexdigest()
|
||||||
|
|
||||||
|
def to_json(obj):
|
||||||
|
obj_dict = obj.__dict__
|
||||||
|
if obj_dict['blockchainecosystem']:
|
||||||
|
print(obj_dict['blockchainecosystem'])
|
||||||
|
obj_dict['blockchainecosystem'] = [
|
||||||
|
bc.name for bc in obj_dict['blockchainecosystem']]
|
||||||
|
else:
|
||||||
|
obj_dict['web3'] = None
|
||||||
|
if obj_dict['impactarea']:
|
||||||
|
print(obj_dict['impactarea'])
|
||||||
|
obj_dict['impactarea'] = [ia.name for ia in obj_dict['impactarea']]
|
||||||
|
else:
|
||||||
|
obj_dict['web3'] = None
|
||||||
|
if obj_dict['topic']:
|
||||||
|
print(obj_dict['topic'])
|
||||||
|
obj_dict['topic'] = [t.name for t in obj_dict['topic']]
|
||||||
|
else:
|
||||||
|
obj_dict['web3'] = None
|
||||||
|
if obj_dict['web3']:
|
||||||
|
print(obj_dict['web3'])
|
||||||
|
obj_dict['web3'] = [w.name for w in obj_dict['web3']]
|
||||||
|
else:
|
||||||
|
obj_dict['web3'] = None
|
||||||
|
print(obj_dict['datecreated'])
|
||||||
|
obj_dict['datecreated'] = obj_dict['datecreated'].isoformat()
|
||||||
|
print("here")
|
||||||
|
print("here" + json.dumps(obj_dict))
|
||||||
|
return json.dumps(obj_dict)
|
||||||
|
|
||||||
|
|
||||||
with open("Organizations.csv") as file:
|
with open("Organizations.csv") as file:
|
||||||
csv_file = csv.reader(file)
|
csv_file = csv.reader(file)
|
||||||
|
|
@ -47,7 +90,7 @@ with open("Organizations.csv") as file:
|
||||||
value = value.strip().strip('"')
|
value = value.strip().strip('"')
|
||||||
if value == "Social justice":
|
if value == "Social justice":
|
||||||
impact_area_set.add(ImpactArea.SocialJustice)
|
impact_area_set.add(ImpactArea.SocialJustice)
|
||||||
elif value in ("Food & Agriculture","Food & Ag."):
|
elif value in ("Food & Agriculture", "Food & Ag."):
|
||||||
impact_area_set.add(ImpactArea.FoodAg)
|
impact_area_set.add(ImpactArea.FoodAg)
|
||||||
elif value == "Invest":
|
elif value == "Invest":
|
||||||
impact_area_set.add(ImpactArea.Politicsactivism)
|
impact_area_set.add(ImpactArea.Politicsactivism)
|
||||||
|
|
@ -55,7 +98,8 @@ with open("Organizations.csv") as file:
|
||||||
impact_area_set.add(ImpactArea.Investing)
|
impact_area_set.add(ImpactArea.Investing)
|
||||||
elif value == "Innovate":
|
elif value == "Innovate":
|
||||||
impact_area_set.add(ImpactArea.Innovation)
|
impact_area_set.add(ImpactArea.Innovation)
|
||||||
else: impact_area_set.add(ImpactArea[value])
|
else:
|
||||||
|
impact_area_set.add(ImpactArea[value])
|
||||||
blockchainEcosystem = row[1].strip("{}").split(",")
|
blockchainEcosystem = row[1].strip("{}").split(",")
|
||||||
blockchainEcosystem_set = set()
|
blockchainEcosystem_set = set()
|
||||||
for value in blockchainEcosystem:
|
for value in blockchainEcosystem:
|
||||||
|
|
@ -70,11 +114,11 @@ with open("Organizations.csv") as file:
|
||||||
elif blockchain == "Hyperledger Fabric":
|
elif blockchain == "Hyperledger Fabric":
|
||||||
blockchain = Blockchain.HyperledgerFabric
|
blockchain = Blockchain.HyperledgerFabric
|
||||||
elif blockchain == "Zero Carbon":
|
elif blockchain == "Zero Carbon":
|
||||||
blockchain = Blockchain.ZeroCarbon
|
blockchain = Blockchain.ZeroCarbon
|
||||||
elif blockchain == "IXO":
|
elif blockchain == "IXO":
|
||||||
blockchain = Blockchain.ixo
|
blockchain = Blockchain.ixo
|
||||||
elif blockchain in ("Not found","Not sure / still deciding"):
|
elif blockchain in ("Not found", "Not sure / still deciding"):
|
||||||
blockchain = Blockchain.Other
|
blockchain = Blockchain.Other
|
||||||
elif blockchain == "Not applicable":
|
elif blockchain == "Not applicable":
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
|
@ -85,8 +129,8 @@ with open("Organizations.csv") as file:
|
||||||
for value in re.split(",(?![^(]*\))", web3):
|
for value in re.split(",(?![^(]*\))", web3):
|
||||||
if value:
|
if value:
|
||||||
web3 = value.strip().strip('"')
|
web3 = value.strip().strip('"')
|
||||||
#someone put "Blockchain (L1,DAO" which will match to "Blockchain (L1" since we strip the '"'
|
# someone put "Blockchain (L1,DAO" which will match to "Blockchain (L1" since we strip the '"'
|
||||||
if web3 in ("Blockchain (L1, L2)","Blockchain (L1,L2)","Blockchain (L1"):
|
if web3 in ("Blockchain (L1, L2)", "Blockchain (L1,L2)", "Blockchain (L1"):
|
||||||
web3 = Web3.Blockchain
|
web3 = Web3.Blockchain
|
||||||
else:
|
else:
|
||||||
web3 = Web3[web3]
|
web3 = Web3[web3]
|
||||||
|
|
@ -114,7 +158,8 @@ with open("Organizations.csv") as file:
|
||||||
topic = Topic.FoodForests
|
topic = Topic.FoodForests
|
||||||
elif topic == "Eco-Living":
|
elif topic == "Eco-Living":
|
||||||
topic = Topic.EcoLiving
|
topic = Topic.EcoLiving
|
||||||
else: topic = Topic[topic]
|
else:
|
||||||
|
topic = Topic[topic]
|
||||||
topic_set.add(topic)
|
topic_set.add(topic)
|
||||||
date_string = row[2]
|
date_string = row[2]
|
||||||
utc_date = datetime.min
|
utc_date = datetime.min
|
||||||
|
|
@ -132,25 +177,43 @@ with open("Organizations.csv") as file:
|
||||||
if upvotesstr.isdigit():
|
if upvotesstr.isdigit():
|
||||||
upvotesint = int(upvotesstr)
|
upvotesint = int(upvotesstr)
|
||||||
|
|
||||||
orgs[counter] = Organization(
|
org = Organization(
|
||||||
assignee = row[0] if row[0] not in [None, ''] else None,
|
assignee=row[0] if row[0] not in [None, ''] else None,
|
||||||
blockchainecosystem = blockchainEcosystem_set if len(blockchainEcosystem_set) > 0 else None,
|
blockchainecosystem=blockchainEcosystem_set if len(
|
||||||
description = row[3] if row[3] not in [None, ''] else None,
|
blockchainEcosystem_set) > 0 else None,
|
||||||
logo = row[5] if row[5] not in [None, ''] else None,
|
description=row[3] if row[3] not in [None, ''] else None,
|
||||||
#name is the only mandatory field, so default it to "" if blank
|
logo=row[5] if row[5] not in [None, ''] else None,
|
||||||
name = row[6] if row[6] not in [None, ''] else "",
|
# name is the only mandatory field, so default it to "" if blank
|
||||||
preJan20thUpvotes = preJan20thUpvotesint if preJan20thUpvotesint not in [0] else None,
|
name=row[6] if row[6] not in [None, ''] else "",
|
||||||
reviewed = row[8] if row[3] not in [None, ''] else None,
|
preJan20thUpvotes=preJan20thUpvotesint if preJan20thUpvotesint not in [
|
||||||
submittedbyemail = row[9] if row[9] not in [None, ''] else None,
|
0] else None,
|
||||||
submittedbyname = row[10] if row[10] not in [None, ''] else None,
|
reviewed=row[8] if row[3] not in [None, ''] else None,
|
||||||
submittedbyowner = row[11] if row[11] not in [None, ''] else None,
|
submittedbyemail=row[9] if row[9] not in [None, ''] else None,
|
||||||
subscribed = row[12] if row[12] not in [None, ''] else None,
|
submittedbyname=row[10] if row[10] not in [None, ''] else None,
|
||||||
topic = topic_set if len(topic_set) > 0 else None,
|
submittedbyowner=row[11] if row[11] not in [
|
||||||
upvotes = upvotesint if upvotesint not in [0] else None,
|
None, ''] else None,
|
||||||
web3 = web3_set if len(web3_set) > 0 else None,
|
subscribed=row[12] if row[12] not in [None, ''] else None,
|
||||||
impactarea = impact_area_set if len(impact_area_set) > 0 else None,
|
topic=topic_set if len(topic_set) > 0 else None,
|
||||||
datecreated = utc_date if impact_area_set not in [datetime.min] else None,
|
upvotes=upvotesint if upvotesint not in [0] else None,
|
||||||
|
web3=web3_set if len(web3_set) > 0 else None,
|
||||||
|
impactarea=impact_area_set if len(
|
||||||
|
impact_area_set) > 0 else None,
|
||||||
|
datecreated=utc_date if impact_area_set not in [
|
||||||
|
datetime.min] else None,
|
||||||
)
|
)
|
||||||
counter += 1
|
|
||||||
client.insert_document(list(orgs.values()), commit_msg="Adding orgs")
|
|
||||||
|
|
||||||
|
orgs[counter] = org
|
||||||
|
# print(to_json(org))
|
||||||
|
# orgsjson.append(to_json(org))
|
||||||
|
counter += 1
|
||||||
|
inserted = client.insert_document(
|
||||||
|
list(orgs.values()), commit_msg="Adding orgs")
|
||||||
|
documents = []
|
||||||
|
for id in inserted:
|
||||||
|
document = client.get_document(id)
|
||||||
|
real_id = document['@id']
|
||||||
|
num_id = real_id.split("/")[-1]
|
||||||
|
document = {k: json.dumps(v) for k, v in document.items() if k != '@id'}
|
||||||
|
document.update({'id': num_id})
|
||||||
|
documents.append(document)
|
||||||
|
index.add_documents(documents)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import json
|
||||||
####
|
####
|
||||||
# This is the script for storing the schema of your TerminusDB
|
# This is the script for storing the schema of your TerminusDB
|
||||||
# database for your project.
|
# database for your project.
|
||||||
|
|
@ -56,6 +57,7 @@ class Blockchain(EnumTemplate):
|
||||||
ZeroCarbon = ()
|
ZeroCarbon = ()
|
||||||
Topl = ()
|
Topl = ()
|
||||||
HBAR = ()
|
HBAR = ()
|
||||||
|
|
||||||
class Organization(DocumentTemplate):
|
class Organization(DocumentTemplate):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -208,3 +210,4 @@ class Topic(EnumTemplate):
|
||||||
Other = ()
|
Other = ()
|
||||||
IoT = ()
|
IoT = ()
|
||||||
EcoLiving = ()
|
EcoLiving = ()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"clipboard-copy": "^4.0.1",
|
"clipboard-copy": "^4.0.1",
|
||||||
"cytoscape": "^3.23.0",
|
"cytoscape": "^3.23.0",
|
||||||
|
"meilisearch": "^0.31.1",
|
||||||
"qrcode-svg": "^1.1.0",
|
"qrcode-svg": "^1.1.0",
|
||||||
"uint8arrays": "^3.1.0",
|
"uint8arrays": "^3.1.0",
|
||||||
"webnative": "^0.34.1"
|
"webnative": "^0.34.1"
|
||||||
|
|
@ -3142,6 +3143,33 @@
|
||||||
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/cross-fetch": {
|
||||||
|
"version": "3.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
|
||||||
|
"integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
|
||||||
|
"dependencies": {
|
||||||
|
"node-fetch": "2.6.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/cross-fetch/node_modules/node-fetch": {
|
||||||
|
"version": "2.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||||
|
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||||
|
|
@ -6375,6 +6403,14 @@
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/meilisearch": {
|
||||||
|
"version": "0.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/meilisearch/-/meilisearch-0.31.1.tgz",
|
||||||
|
"integrity": "sha512-ajMieU0e25lLkT+05J0snX0Ycow1UofxIy5sag03flERUbjXq8ouVwkrJkW27JsKftIeDeffRRRr89LasU9+0w==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-fetch": "^3.1.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/mem": {
|
"node_modules/mem": {
|
||||||
"version": "9.0.2",
|
"version": "9.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
|
||||||
|
|
@ -8502,6 +8538,11 @@
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
|
},
|
||||||
"node_modules/ts-node": {
|
"node_modules/ts-node": {
|
||||||
"version": "10.9.1",
|
"version": "10.9.1",
|
||||||
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
|
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
|
||||||
|
|
@ -8799,6 +8840,11 @@
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||||
|
},
|
||||||
"node_modules/webnative": {
|
"node_modules/webnative": {
|
||||||
"version": "0.34.1",
|
"version": "0.34.1",
|
||||||
"resolved": "https://registry.npmjs.org/webnative/-/webnative-0.34.1.tgz",
|
"resolved": "https://registry.npmjs.org/webnative/-/webnative-0.34.1.tgz",
|
||||||
|
|
@ -8839,6 +8885,15 @@
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
||||||
|
|
@ -11292,6 +11347,24 @@
|
||||||
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"cross-fetch": {
|
||||||
|
"version": "3.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
|
||||||
|
"integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
|
||||||
|
"requires": {
|
||||||
|
"node-fetch": "2.6.7"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"node-fetch": {
|
||||||
|
"version": "2.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||||
|
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||||
|
"requires": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||||
|
|
@ -13610,6 +13683,14 @@
|
||||||
"blueimp-md5": "^2.10.0"
|
"blueimp-md5": "^2.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"meilisearch": {
|
||||||
|
"version": "0.31.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/meilisearch/-/meilisearch-0.31.1.tgz",
|
||||||
|
"integrity": "sha512-ajMieU0e25lLkT+05J0snX0Ycow1UofxIy5sag03flERUbjXq8ouVwkrJkW27JsKftIeDeffRRRr89LasU9+0w==",
|
||||||
|
"requires": {
|
||||||
|
"cross-fetch": "^3.1.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"mem": {
|
"mem": {
|
||||||
"version": "9.0.2",
|
"version": "9.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
|
||||||
|
|
@ -15043,6 +15124,11 @@
|
||||||
"integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
|
"integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
|
},
|
||||||
"ts-node": {
|
"ts-node": {
|
||||||
"version": "10.9.1",
|
"version": "10.9.1",
|
||||||
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
|
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
|
||||||
|
|
@ -15242,6 +15328,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
|
||||||
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
|
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
|
||||||
},
|
},
|
||||||
|
"webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||||
|
},
|
||||||
"webnative": {
|
"webnative": {
|
||||||
"version": "0.34.1",
|
"version": "0.34.1",
|
||||||
"resolved": "https://registry.npmjs.org/webnative/-/webnative-0.34.1.tgz",
|
"resolved": "https://registry.npmjs.org/webnative/-/webnative-0.34.1.tgz",
|
||||||
|
|
@ -15276,6 +15367,15 @@
|
||||||
"integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
|
"integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"requires": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"which": {
|
"which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"clipboard-copy": "^4.0.1",
|
"clipboard-copy": "^4.0.1",
|
||||||
"cytoscape": "^3.23.0",
|
"cytoscape": "^3.23.0",
|
||||||
|
"meilisearch": "^0.31.1",
|
||||||
"qrcode-svg": "^1.1.0",
|
"qrcode-svg": "^1.1.0",
|
||||||
"uint8arrays": "^3.1.0",
|
"uint8arrays": "^3.1.0",
|
||||||
"webnative": "^0.34.1"
|
"webnative": "^0.34.1"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
import meilisearch
|
||||||
|
|
||||||
|
client = meilisearch.Client('https://ms-9ea4a96f02a8-1969.sfo.meilisearch.io', '117c691a34b21a6651798479ebffd181eb276958')
|
||||||
|
|
||||||
|
# An index is where the documents are stored.
|
||||||
|
index = client.index('movies')
|
||||||
|
|
||||||
|
documents = [
|
||||||
|
{ 'id': 1, 'title': 'Carol', 'genres': ['Romance', 'Drama'] },
|
||||||
|
{ 'id': 2, 'title': 'Wonder Woman', 'genres': ['Action', 'Adventure'] },
|
||||||
|
{ 'id': 3, 'title': 'Life of Pi', 'genres': ['Adventure', 'Drama'] },
|
||||||
|
{ 'id': 4, 'title': 'Mad Max: Fury Road', 'genres': ['Adventure', 'Science Fiction'] },
|
||||||
|
{ 'id': 5, 'title': 'Moana', 'genres': ['Fantasy', 'Action']},
|
||||||
|
{ 'id': 6, 'title': 'Philadelphia', 'genres': ['Drama'] },
|
||||||
|
]
|
||||||
|
|
||||||
|
# If the index 'movies' does not exist, Meilisearch creates it when you first add the documents.
|
||||||
|
index.add_documents(documents) # => { "uid": 0 }', 'masterKey')
|
||||||
|
|
||||||
|
# An index is where the documents are stored.
|
||||||
|
index = client.index('movies')
|
||||||
|
|
||||||
|
documents = [
|
||||||
|
{ 'id': 1, 'title': 'Carol', 'genres': ['Romance', 'Drama'] },
|
||||||
|
{ 'id': 2, 'title': 'Wonder Woman', 'genres': ['Action', 'Adventure'] },
|
||||||
|
{ 'id': 3, 'title': 'Life of Pi', 'genres': ['Adventure', 'Drama'] },
|
||||||
|
{ 'id': 4, 'title': 'Mad Max: Fury Road', 'genres': ['Adventure', 'Science Fiction'] },
|
||||||
|
{ 'id': 5, 'title': 'Moana', 'genres': ['Fantasy', 'Action']},
|
||||||
|
{ 'id': 6, 'title': 'Philadelphia', 'genres': ['Drama'] },
|
||||||
|
]
|
||||||
|
|
||||||
|
# If the index 'movies' does not exist, Meilisearch creates it when you first add the documents.
|
||||||
|
index.add_documents(documents) # => { "uid": 0 }
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
import meilisearch
|
||||||
|
|
||||||
|
client = meilisearch.Client('https://ms-9ea4a96f02a8-1969.sfo.meilisearch.io', '117c691a34b21a6651798479ebffd181eb276958')
|
||||||
|
|
||||||
|
result = index.search('caorl')
|
||||||
|
|
||||||
|
print(result)
|
||||||
|
|
@ -0,0 +1,334 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import cytoscape from 'cytoscape'
|
||||||
|
import { onMount } from 'svelte'
|
||||||
|
import { bubble } from 'svelte/internal'
|
||||||
|
import TerminusClient from '@terminusdb/terminusdb-client'
|
||||||
|
import { MeiliSearch } from 'meilisearch'
|
||||||
|
|
||||||
|
let cy
|
||||||
|
|
||||||
|
interface INodeData {
|
||||||
|
id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface INode {
|
||||||
|
data: INodeData
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IEdgeData {
|
||||||
|
id: string
|
||||||
|
source: string
|
||||||
|
target: string
|
||||||
|
label: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IEdge {
|
||||||
|
data: IEdgeData
|
||||||
|
}
|
||||||
|
|
||||||
|
import json_graph from './knowledge_graph.json'
|
||||||
|
|
||||||
|
let knowledgeGraphJson: any = json_graph
|
||||||
|
|
||||||
|
// knowledgeGraphJson = await response.json()
|
||||||
|
// } else {
|
||||||
|
// alert(`HTTP-Error: ${response.status}`)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
let nodes: INode[] = []
|
||||||
|
let edges: IEdge[] = []
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
//await fetchData();
|
||||||
|
nodes = knowledgeGraphJson.entities.map((entity: any) => ({
|
||||||
|
data: { id: entity.id, label: entity.label }
|
||||||
|
}))
|
||||||
|
|
||||||
|
edges = knowledgeGraphJson.relations.map(
|
||||||
|
(relation: any, index: string) => ({
|
||||||
|
data: {
|
||||||
|
id: index,
|
||||||
|
source: relation.source,
|
||||||
|
target: relation.target,
|
||||||
|
label: relation.type
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
cy = cytoscape({
|
||||||
|
container: document.getElementById('cy'),
|
||||||
|
elements: {
|
||||||
|
nodes,
|
||||||
|
edges
|
||||||
|
},
|
||||||
|
style: [
|
||||||
|
{
|
||||||
|
selector: 'node',
|
||||||
|
style: {
|
||||||
|
'text-valign': 'center',
|
||||||
|
'text-halign': 'center',
|
||||||
|
'text-wrap': 'wrap',
|
||||||
|
'text-max-width': function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 30
|
||||||
|
},
|
||||||
|
'font-size': function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 6
|
||||||
|
},
|
||||||
|
'background-color': '#75f6df',
|
||||||
|
'border-color': '#223152',
|
||||||
|
'border-width': function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2))
|
||||||
|
},
|
||||||
|
label: 'data(label)',
|
||||||
|
width: function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 40
|
||||||
|
},
|
||||||
|
height: function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 40
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
selector: 'edge',
|
||||||
|
style: {
|
||||||
|
'font-size': 20,
|
||||||
|
width: 5,
|
||||||
|
'line-color': '#223152',
|
||||||
|
'target-arrow-color': '#223152',
|
||||||
|
'target-arrow-shape': 'triangle',
|
||||||
|
'curve-style': 'bezier',
|
||||||
|
'text-rotation': 'autorotate',
|
||||||
|
'text-offset': { x: 20, y: -20 },
|
||||||
|
'text-background-opacity': 1,
|
||||||
|
'text-background-color': '#fafafa',
|
||||||
|
'text-background-shape': 'roundrectangle',
|
||||||
|
label: 'data(label)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
layout: {
|
||||||
|
name: 'cose'
|
||||||
|
// infinite: true,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
cy.nodes().forEach(function (node) {
|
||||||
|
node.data({
|
||||||
|
degree: node.connectedEdges().length
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
var nodes = cy.nodes()
|
||||||
|
nodes = nodes.sort(function (a, b) {
|
||||||
|
return b.data('degree') - a.data('degree')
|
||||||
|
})
|
||||||
|
|
||||||
|
var top100 = nodes.slice(0, 1000)
|
||||||
|
|
||||||
|
console.log(top100);
|
||||||
|
|
||||||
|
cy.nodes().forEach(function (node) {
|
||||||
|
if (!top100.includes(node)) {
|
||||||
|
node.hide()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let toggle = true
|
||||||
|
|
||||||
|
// cy.off('tap', 'node', event => {
|
||||||
|
// const node = event.target;
|
||||||
|
// const nodeId = node.data('id');
|
||||||
|
// alert('unDisplay info for ' + nodeId);
|
||||||
|
// });
|
||||||
|
|
||||||
|
cy.on('tap', 'node', function (evt) {
|
||||||
|
var node = evt.target
|
||||||
|
var connectedEdges = node.connectedEdges()
|
||||||
|
var connectedNodes = node.neighborhood().nodes()
|
||||||
|
var allElements = cy.elements()
|
||||||
|
var allNodes = cy.nodes()
|
||||||
|
var allEdges = cy.edges()
|
||||||
|
|
||||||
|
if (node.style('display') == 'element') {
|
||||||
|
// hide all nodes and edges except the selected node and its neighbors
|
||||||
|
allNodes.style('display', 'none')
|
||||||
|
allEdges.style('display', 'none')
|
||||||
|
connectedNodes.style('display', 'element')
|
||||||
|
node.style('display', 'element')
|
||||||
|
connectedEdges.style('display', 'element')
|
||||||
|
} else {
|
||||||
|
// show all nodes and edges
|
||||||
|
allNodes.style('display', 'element')
|
||||||
|
allEdges.style('display', 'element')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Reset the state when clicking away from the node
|
||||||
|
cy.on('tap', function (e) {
|
||||||
|
if (e.target === cy) {
|
||||||
|
cy.nodes().style('display', 'element')
|
||||||
|
cy.edges().style('display', 'element')
|
||||||
|
cy.nodes().data('highlighted', false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
cy.on('tap', 'edge', event => {
|
||||||
|
const edge = event.target
|
||||||
|
const edgeId = edge.data('id')
|
||||||
|
alert('Display info for ' + edgeId)
|
||||||
|
})
|
||||||
|
|
||||||
|
// cy.on('tap', 'node', function(){
|
||||||
|
// alert("put code here"));
|
||||||
|
// });
|
||||||
|
|
||||||
|
// cy.layout({
|
||||||
|
// name: 'cola'
|
||||||
|
// }).run();
|
||||||
|
})
|
||||||
|
|
||||||
|
var searchTerm = ''
|
||||||
|
function updateSearchTerm(e) {
|
||||||
|
searchTerm = e.target.value
|
||||||
|
// Perform search in real timebased on searchTerm here
|
||||||
|
}
|
||||||
|
|
||||||
|
async function entered(e) {
|
||||||
|
alert(e.target.value.toString())
|
||||||
|
const searchclient = new MeiliSearch({
|
||||||
|
host: 'https://ms-9ea4a96f02a8-1969.sfo.meilisearch.io',
|
||||||
|
apiKey: '117c691a34b21a6651798479ebffd181eb276958'
|
||||||
|
})
|
||||||
|
const index = searchclient.index('orgs')
|
||||||
|
// this will search both keys and values
|
||||||
|
// const search = await index.search(e.target.value.toString(), { q: '*' });
|
||||||
|
// const searchResult = await index.search('orgs', {
|
||||||
|
// attributesToRetrieve: ['id']
|
||||||
|
// })
|
||||||
|
const searchResult = await index.search(e.target.value.toString());
|
||||||
|
|
||||||
|
console.log(searchResult)
|
||||||
|
// var node = cy.nodes().filter(function (ele) {
|
||||||
|
// return ele.data('id') == "Organization/" + searchResult.hits[0].id
|
||||||
|
// })
|
||||||
|
// console.log(node);
|
||||||
|
// var connectedEdges = node.connectedEdges()
|
||||||
|
// var connectedNodes = node.neighborhood().nodes()
|
||||||
|
// var allElements = cy.elements()
|
||||||
|
// var allNodes = cy.nodes()
|
||||||
|
// var allEdges = cy.edges()
|
||||||
|
|
||||||
|
// if (node.style('display') == 'element') {
|
||||||
|
// console.log("a");
|
||||||
|
// // hide all nodes and edges except the selected node and its neighbors
|
||||||
|
// allNodes.style('display', 'none')
|
||||||
|
// allEdges.style('display', 'none')
|
||||||
|
// connectedNodes.style('display', 'element')
|
||||||
|
// node.style('display', 'element')
|
||||||
|
// connectedEdges.style('display', 'element')
|
||||||
|
// } else {
|
||||||
|
// console.log("b");
|
||||||
|
// // show all nodes and edges
|
||||||
|
// allNodes.style('display', 'element')
|
||||||
|
// allEdges.style('display', 'element')
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Perform search in real time based on searchTerm here
|
||||||
|
const client = new TerminusClient.WOQLClient(
|
||||||
|
'https://cloud.terminusdb.com/Myseelia/',
|
||||||
|
{
|
||||||
|
user: 'zaldarren@gmail.com',
|
||||||
|
organization: 'Myseelia',
|
||||||
|
db: 'playground3',
|
||||||
|
token:
|
||||||
|
'dGVybWludXNkYjovLy9kYXRhL2tleXNfYXBpLzJkMDU4N2IwYjgzMzhmODdjMjc0ZDdiNmM1MzgwNjFmYTYyMmZkOTcyZTc3NjI1NzIyYjY3MTllYTE3NmQxYjE=_bd6f9c37d87abcaf0c16b7a68335b31010c8dd04aac0b07bf0f31676af131888666200aac080e72cdc746197334eac4f52d821c90652b5611784878afabe1267535cbd896a00a396'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
try {
|
||||||
|
await client.connect()
|
||||||
|
//console.log(schema);
|
||||||
|
// console.log("result");
|
||||||
|
|
||||||
|
// const result = await client.getDocument({as_list:true,type:"Person",query: { userName: "tester" }})
|
||||||
|
// console.log(result);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('this is it' + err.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// let v = WOQL.vars('person_id', 'impactarea', '@schema:checked');
|
||||||
|
const WOQL = TerminusClient.WOQL
|
||||||
|
const query = WOQL.triple(
|
||||||
|
'v:OrganizationID',
|
||||||
|
'name',
|
||||||
|
WOQL.string('Sustainable Impact Token')
|
||||||
|
)
|
||||||
|
|
||||||
|
const query3 = WOQL.and(
|
||||||
|
WOQL.triple('v:NodeID', 'property_name', WOQL.like(`%${keyword}%`)),
|
||||||
|
WOQL.triple('v:NodeID', 'property_name', 'v:Value')
|
||||||
|
)
|
||||||
|
|
||||||
|
const result = await client.getDocument({
|
||||||
|
as_list: true,
|
||||||
|
type: 'Organization',
|
||||||
|
query: { name: 'Sustainable Impact Token' }
|
||||||
|
})
|
||||||
|
console.log('result ', result)
|
||||||
|
const results = await client.query(query)
|
||||||
|
console.log('Query Documents using WOQL: ', results.bindings)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="pt-8 p-6 md:p-8 mx-auto">
|
||||||
|
<input
|
||||||
|
id="search"
|
||||||
|
type="text"
|
||||||
|
placeholder="Search..."
|
||||||
|
on:input={updateSearchTerm}
|
||||||
|
on:keydown={event => {
|
||||||
|
if (event.keyCode === 13) {
|
||||||
|
entered(event)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<section class="overflow-hidden text-gray-700">
|
||||||
|
<div class="cyDiv" />
|
||||||
|
|
||||||
|
<div id="cy" />
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#search {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
z-index: 100;
|
||||||
|
background-color: white;
|
||||||
|
width: 50%;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 10px 20px 10px 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search input[type='text'] {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 50px;
|
||||||
|
width: 80%;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
#cy-div {
|
||||||
|
z-index: 99;
|
||||||
|
}
|
||||||
|
#cy {
|
||||||
|
width: 100%;
|
||||||
|
height: 95%;
|
||||||
|
position: absolute;
|
||||||
|
top: 55px;
|
||||||
|
left: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -2,9 +2,11 @@
|
||||||
import cytoscape from 'cytoscape'
|
import cytoscape from 'cytoscape'
|
||||||
import { onMount } from 'svelte'
|
import { onMount } from 'svelte'
|
||||||
import { bubble } from 'svelte/internal'
|
import { bubble } from 'svelte/internal'
|
||||||
|
import TerminusClient from '@terminusdb/terminusdb-client'
|
||||||
|
import { MeiliSearch } from 'meilisearch'
|
||||||
|
import { generateKnowledgeGraph } from './cytoscape.ts'
|
||||||
|
|
||||||
let cy
|
let cy
|
||||||
let cyDiv
|
|
||||||
|
|
||||||
interface INodeData {
|
interface INodeData {
|
||||||
id: string
|
id: string
|
||||||
|
|
@ -24,14 +26,12 @@
|
||||||
interface IEdge {
|
interface IEdge {
|
||||||
data: IEdgeData
|
data: IEdgeData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
import json_graph from './knowledge_graph.json'
|
||||||
import json_graph from './knowledge_graph.json';
|
|
||||||
|
|
||||||
let knowledgeGraphJson: any = json_graph;
|
let knowledgeGraphJson: any = json_graph
|
||||||
|
|
||||||
// knowledgeGraphJson = await response.json()
|
// knowledgeGraphJson = await response.json()
|
||||||
// } else {
|
// } else {
|
||||||
// alert(`HTTP-Error: ${response.status}`)
|
// alert(`HTTP-Error: ${response.status}`)
|
||||||
// }
|
// }
|
||||||
|
|
@ -41,7 +41,6 @@
|
||||||
let edges: IEdge[] = []
|
let edges: IEdge[] = []
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
//await fetchData();
|
|
||||||
nodes = knowledgeGraphJson.entities.map((entity: any) => ({
|
nodes = knowledgeGraphJson.entities.map((entity: any) => ({
|
||||||
data: { id: entity.id, label: entity.label }
|
data: { id: entity.id, label: entity.label }
|
||||||
}))
|
}))
|
||||||
|
|
@ -57,7 +56,7 @@
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
let cy = cytoscape({
|
cy = cytoscape({
|
||||||
container: document.getElementById('cy'),
|
container: document.getElementById('cy'),
|
||||||
elements: {
|
elements: {
|
||||||
nodes,
|
nodes,
|
||||||
|
|
@ -70,26 +69,36 @@
|
||||||
'text-valign': 'center',
|
'text-valign': 'center',
|
||||||
'text-halign': 'center',
|
'text-halign': 'center',
|
||||||
'text-wrap': 'wrap',
|
'text-wrap': 'wrap',
|
||||||
"text-max-width": function(ele){ return Math.max(1, Math.ceil(ele.degree()/2)) * 30; },
|
'text-max-width': function (ele) {
|
||||||
"font-size": function(ele){ return Math.max(1, Math.ceil(ele.degree()/2)) * 6; },
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 30
|
||||||
'background-color': "#75f6df",
|
},
|
||||||
'border-color': "#223152",
|
'font-size': function (ele) {
|
||||||
'border-width': function(ele){ return Math.max(1, Math.ceil(ele.degree()/2)); },
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 6
|
||||||
|
},
|
||||||
|
'background-color': '#75f6df',
|
||||||
|
'border-color': '#223152',
|
||||||
|
'border-width': function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2))
|
||||||
|
},
|
||||||
label: 'data(label)',
|
label: 'data(label)',
|
||||||
width: function(ele){ return Math.max(1, Math.ceil(ele.degree()/2)) * 40; },
|
width: function (ele) {
|
||||||
height: function(ele){ return Math.max(1, Math.ceil(ele.degree()/2)) * 40; }
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 40
|
||||||
|
},
|
||||||
|
height: function (ele) {
|
||||||
|
return Math.max(1, Math.ceil(ele.degree() / 2)) * 40
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
selector: 'edge',
|
selector: 'edge',
|
||||||
style: {
|
style: {
|
||||||
"font-size": 20,
|
'font-size': 20,
|
||||||
width: 5,
|
width: 5,
|
||||||
'line-color': "#223152",
|
'line-color': '#223152',
|
||||||
'target-arrow-color': "#223152",
|
'target-arrow-color': '#223152',
|
||||||
'target-arrow-shape': 'triangle',
|
'target-arrow-shape': 'triangle',
|
||||||
'curve-style': 'bezier',
|
'curve-style': 'bezier',
|
||||||
"text-rotation": "autorotate",
|
'text-rotation': 'autorotate',
|
||||||
'text-offset': { x: 20, y: -20 },
|
'text-offset': { x: 20, y: -20 },
|
||||||
'text-background-opacity': 1,
|
'text-background-opacity': 1,
|
||||||
'text-background-color': '#fafafa',
|
'text-background-color': '#fafafa',
|
||||||
|
|
@ -104,50 +113,65 @@
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
let toggle = true;
|
cy.nodes().forEach(function (node) {
|
||||||
|
node.data({
|
||||||
|
degree: node.connectedEdges().length
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
var nodes = cy.nodes()
|
||||||
|
nodes = nodes.sort(function (a, b) {
|
||||||
|
return b.data('degree') - a.data('degree')
|
||||||
|
})
|
||||||
|
|
||||||
|
var top100 = nodes.slice(0, 1000)
|
||||||
|
|
||||||
|
//console.log(top100)
|
||||||
|
|
||||||
|
cy.nodes().forEach(function (node) {
|
||||||
|
if (!top100.includes(node)) {
|
||||||
|
node.hide()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let toggle = true
|
||||||
|
|
||||||
// cy.off('tap', 'node', event => {
|
// cy.off('tap', 'node', event => {
|
||||||
// const node = event.target;
|
// const node = event.target;
|
||||||
// const nodeId = node.data('id');
|
// const nodeId = node.data('id');
|
||||||
// alert('unDisplay info for ' + nodeId);
|
// alert('unDisplay info for ' + nodeId);
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
cy.on('tap', 'node', function (evt) {
|
||||||
|
var node = evt.target
|
||||||
|
var connectedEdges = node.connectedEdges()
|
||||||
|
var connectedNodes = node.neighborhood().nodes()
|
||||||
|
var allElements = cy.elements()
|
||||||
|
var allNodes = cy.nodes()
|
||||||
|
var allEdges = cy.edges()
|
||||||
|
|
||||||
cy.on('tap', 'node', function(evt){
|
if (node.style('display') == 'element') {
|
||||||
var node = evt.target;
|
// hide all nodes and edges except the selected node and its neighbors
|
||||||
var connectedEdges = node.connectedEdges();
|
allNodes.style('display', 'none')
|
||||||
var connectedNodes = node.neighborhood().nodes();
|
allEdges.style('display', 'none')
|
||||||
var allElements = cy.elements();
|
connectedNodes.style('display', 'element')
|
||||||
var allNodes = cy.nodes();
|
node.style('display', 'element')
|
||||||
var allEdges = cy.edges();
|
connectedEdges.style('display', 'element')
|
||||||
|
} else {
|
||||||
if (node.style("display") == "element") {
|
// show all nodes and edges
|
||||||
// hide all nodes and edges except the selected node and its neighbors
|
allNodes.style('display', 'element')
|
||||||
allNodes.style("display", "none");
|
allEdges.style('display', 'element')
|
||||||
allEdges.style("display", "none");
|
}
|
||||||
connectedNodes.style("display", "element");
|
})
|
||||||
node.style("display", "element");
|
|
||||||
connectedEdges.style("display", "element");
|
|
||||||
} else {
|
|
||||||
// show all nodes and edges
|
|
||||||
allNodes.style("display", "element");
|
|
||||||
allEdges.style("display", "element");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Reset the state when clicking away from the node
|
|
||||||
cy.on('tap', function(e){
|
|
||||||
if (e.target === cy) {
|
|
||||||
cy.nodes().style('display', 'element');
|
|
||||||
cy.edges().style('display', 'element');
|
|
||||||
cy.nodes().data('highlighted', false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
// Reset the state when clicking away from the node
|
||||||
|
cy.on('tap', function (e) {
|
||||||
|
if (e.target === cy) {
|
||||||
|
cy.nodes().style('display', 'element')
|
||||||
|
cy.edges().style('display', 'element')
|
||||||
|
cy.nodes().data('highlighted', false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
cy.on('tap', 'edge', event => {
|
cy.on('tap', 'edge', event => {
|
||||||
const edge = event.target
|
const edge = event.target
|
||||||
|
|
@ -163,15 +187,169 @@ cy.on('tap', function(e){
|
||||||
// name: 'cola'
|
// name: 'cola'
|
||||||
// }).run();
|
// }).run();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
var searchTerm = ''
|
||||||
|
function updateSearchTerm(e) {
|
||||||
|
searchTerm = e.target.value
|
||||||
|
// Perform search in real timebased on searchTerm here
|
||||||
|
}
|
||||||
|
|
||||||
|
async function entered(e) {
|
||||||
|
const searchclient = new MeiliSearch({
|
||||||
|
host: 'https://ms-9ea4a96f02a8-1969.sfo.meilisearch.io',
|
||||||
|
apiKey: '117c691a34b21a6651798479ebffd181eb276958'
|
||||||
|
})
|
||||||
|
const index = searchclient.index('orgs')
|
||||||
|
// this will search both keys and values
|
||||||
|
// const search = await index.search(e.target.value.toString(), { q: '*' });
|
||||||
|
// const searchResult = await index.search('orgs', {
|
||||||
|
// attributesToRetrieve: ['id']
|
||||||
|
// })
|
||||||
|
const searchResult = await index.search(e.target.value.toString(), {
|
||||||
|
attributesToRetrieve: ['id']
|
||||||
|
})
|
||||||
|
|
||||||
|
// need to turn the search results into an array of ids which can be used to query the knowledge graph
|
||||||
|
const resultsgraph = await generateKnowledgeGraph(searchResult.hits).then(
|
||||||
|
resultsgraph => {
|
||||||
|
const allNodes = resultsgraph.entities.map((entity: any) => ({
|
||||||
|
data: { id: entity.id, label: entity.label }
|
||||||
|
}))
|
||||||
|
|
||||||
|
const allEdges = resultsgraph.relations.map(
|
||||||
|
(relation: any, index: string) => ({
|
||||||
|
data: {
|
||||||
|
id: index,
|
||||||
|
source: relation.source,
|
||||||
|
target: relation.target,
|
||||||
|
label: relation.type
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
cy.remove(cy.elements())
|
||||||
|
cy.add(allNodes)
|
||||||
|
cy.add(allEdges)
|
||||||
|
cy.layout({
|
||||||
|
name: 'cose',
|
||||||
|
// other layout options here
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
)
|
||||||
|
// var node = cy.nodes().filter(function (ele) {
|
||||||
|
// return ele.data('id') == "Organization/" + searchResult.hits[0].id
|
||||||
|
// })
|
||||||
|
// console.log(node);
|
||||||
|
// var connectedEdges = node.connectedEdges()
|
||||||
|
// var connectedNodes = node.neighborhood().nodes()
|
||||||
|
// var allElements = cy.elements()
|
||||||
|
// var allNodes = cy.nodes()
|
||||||
|
// var allEdges = cy.edges()
|
||||||
|
|
||||||
|
// if (node.style('display') == 'element') {
|
||||||
|
// console.log("a");
|
||||||
|
// // hide all nodes and edges except the selected node and its neighbors
|
||||||
|
// allNodes.style('display', 'none')
|
||||||
|
// allEdges.style('display', 'none')
|
||||||
|
// connectedNodes.style('display', 'element')
|
||||||
|
// node.style('display', 'element')
|
||||||
|
// connectedEdges.style('display', 'element')
|
||||||
|
// } else {
|
||||||
|
// console.log("b");
|
||||||
|
// // show all nodes and edges
|
||||||
|
// allNodes.style('display', 'element')
|
||||||
|
// allEdges.style('display', 'element')
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Perform search in real time based on searchTerm here
|
||||||
|
const client = new TerminusClient.WOQLClient(
|
||||||
|
'https://cloud.terminusdb.com/Myseelia/',
|
||||||
|
{
|
||||||
|
user: 'zaldarren@gmail.com',
|
||||||
|
organization: 'Myseelia',
|
||||||
|
db: 'playground3',
|
||||||
|
token:
|
||||||
|
'dGVybWludXNkYjovLy9kYXRhL2tleXNfYXBpLzJkMDU4N2IwYjgzMzhmODdjMjc0ZDdiNmM1MzgwNjFmYTYyMmZkOTcyZTc3NjI1NzIyYjY3MTllYTE3NmQxYjE=_bd6f9c37d87abcaf0c16b7a68335b31010c8dd04aac0b07bf0f31676af131888666200aac080e72cdc746197334eac4f52d821c90652b5611784878afabe1267535cbd896a00a396'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
try {
|
||||||
|
await client.connect()
|
||||||
|
//console.log(schema);
|
||||||
|
// console.log("result");
|
||||||
|
|
||||||
|
// const result = await client.getDocument({as_list:true,type:"Person",query: { userName: "tester" }})
|
||||||
|
// console.log(result);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('this is it' + err.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// let v = WOQL.vars('person_id', 'impactarea', '@schema:checked');
|
||||||
|
// const WOQL = TerminusClient.WOQL
|
||||||
|
// const query = WOQL.triple(
|
||||||
|
// 'v:OrganizationID',
|
||||||
|
// 'name',
|
||||||
|
// WOQL.string('Sustainable Impact Token')
|
||||||
|
// )
|
||||||
|
|
||||||
|
// const query3 = WOQL.and(
|
||||||
|
// WOQL.triple('v:NodeID', 'property_name', WOQL.like(`%${keyword}%`)),
|
||||||
|
// WOQL.triple('v:NodeID', 'property_name', 'v:Value')
|
||||||
|
// )
|
||||||
|
|
||||||
|
// const result = await client.getDocument({
|
||||||
|
// as_list: true,
|
||||||
|
// type: 'Organization',
|
||||||
|
// query: { name: 'Sustainable Impact Token' }
|
||||||
|
// })
|
||||||
|
// console.log('result ', result)
|
||||||
|
// const results = await client.query(query)
|
||||||
|
// console.log('Query Documents using WOQL: ', results.bindings)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<div class="pt-8 p-6 md:p-8 mx-auto">
|
||||||
|
<input
|
||||||
|
id="search"
|
||||||
|
type="text"
|
||||||
|
placeholder="Search..."
|
||||||
|
on:input={updateSearchTerm}
|
||||||
|
on:keydown={event => {
|
||||||
|
if (event.keyCode === 13) {
|
||||||
|
entered(event)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<section class="overflow-hidden text-gray-700">
|
<section class="overflow-hidden text-gray-700">
|
||||||
<div class="pt-8 p-6 md:p-8 mx-auto" />
|
<div class="cyDiv" />
|
||||||
|
|
||||||
<div id="cy" />
|
<div id="cy" />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
#search {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
z-index: 100;
|
||||||
|
background-color: white;
|
||||||
|
width: 50%;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 10px 20px 10px 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search input[type='text'] {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 50px;
|
||||||
|
width: 80%;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
#cy-div {
|
||||||
|
z-index: 99;
|
||||||
|
}
|
||||||
#cy {
|
#cy {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 95%;
|
height: 95%;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
import { isNullOrUndefined } from 'util';
|
||||||
|
import { WOQLClient } from 'terminusdb-client';
|
||||||
|
import { resultToDF } from 'terminusdb-client/woqldataframe';
|
||||||
|
import { DataFrame } from 'pandas';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
const client = new WOQLClient("https://cloud.terminusdb.com/Myseelia/");
|
||||||
|
client.connect(db="playground3", team="Myseelia", use_token=true);
|
||||||
|
|
||||||
|
export async function generateKnowledgeGraph(ids: string[]) {
|
||||||
|
const orgsRaw = client.query_document({ "@type": "Organization", "Document id": { "@in": ids } });
|
||||||
|
|
||||||
|
const df = resultToDF(orgsRaw);
|
||||||
|
|
||||||
|
const entities: {id: string, label: string, type: string}[] = [];
|
||||||
|
const relations: {source: string, target: string, type: string}[] = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < df.length; i++) {
|
||||||
|
const row = df[i];
|
||||||
|
entities.push({'id': row['Document id'], 'label': row['name'], 'type': 'organization'});
|
||||||
|
|
||||||
|
if (!isNullOrUndefined(row['assignee'])) {
|
||||||
|
const assigneeId = row['assignee'];
|
||||||
|
if (!isNullOrUndefined(assigneeId) && assigneeId !== '' && !isNaN(assigneeId)) {
|
||||||
|
entities.push({'id': assigneeId, 'label': row['assignee'], 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': assigneeId, 'type': 'assignee'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(row['blockchainecosystem'])) {
|
||||||
|
for (const ecosystem of row['blockchainecosystem']) {
|
||||||
|
const ecosystemId = ecosystem;
|
||||||
|
if (!isNullOrUndefined(ecosystemId) && ecosystemId !== '' && !isNaN(ecosystemId)) {
|
||||||
|
entities.push({'id': ecosystemId, 'label': ecosystem, 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': ecosystemId, 'type': 'blockchain ecosystem'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const ecosystemId = row['blockchainecosystem'];
|
||||||
|
if (!isNullOrUndefined(ecosystemId) && ecosystemId !== '' && !isNaN(ecosystemId)) {
|
||||||
|
entities.push({'id': ecosystemId, 'label': row['blockchainecosystem'], 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': ecosystemId, 'type': 'blockchain ecosystem'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(row['topic'])) {
|
||||||
|
for (const topic of row['topic']) {
|
||||||
|
const topicId = topic;
|
||||||
|
if (!isNullOrUndefined(topicId) && topicId !== '' && !isNaN(topicId)) {
|
||||||
|
entities.push({'id': topicId, 'label': topic, 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': topicId, 'type': 'topic'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const topicId = row['topic'];
|
||||||
|
if (!isNullOrUndefined(topicId) && topicId !== '' && !isNaN(topicId)) {
|
||||||
|
entities.push({'id': topicId, 'label': row['topic'], 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': topicId, 'type': 'topic'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(row['web3'])) {
|
||||||
|
for (const web3 of row['web3']) {
|
||||||
|
const web3Id = web3;
|
||||||
|
if (!isNullOrUndefined(web3Id) && web3Id !== '' && !isNaN(web3Id)) {
|
||||||
|
entities.push({'id': web3Id, 'label': web3, 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': web3Id, 'type': 'web3'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const web3Id = row['web3'];
|
||||||
|
if (!isNullOrUndefined(web3Id) && web3Id !== '' && !isNaN(web3Id)) {
|
||||||
|
entities.push({'id': web3Id, 'label': row['web3'], 'type': 'attribute'});
|
||||||
|
relations.push({'source': row['Document id'], 'target': web3Id, 'type': 'web3'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const knowledgeGraphJson = {
|
||||||
|
'entities': entities,
|
||||||
|
'relations': relations
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.writeFileSync("knowledge_graph.json", JSON.stringify(knowledgeGraphJson), 'utf-8');
|
||||||
|
|
||||||
|
export function getData(client: WOQLClient, ids: string[]): DataFrame {
|
||||||
|
const query = {
|
||||||
|
"@type": "Organization",
|
||||||
|
"Document id": {
|
||||||
|
"$in": ids
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const orgsRaw = client.query_document(query);
|
||||||
|
return resultToDF(orgsRaw);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,164 @@
|
||||||
|
// import { isNullOrUndefined } from 'util'
|
||||||
|
import TerminusClient from '@terminusdb/terminusdb-client'
|
||||||
|
|
||||||
|
import * as fs from 'fs'
|
||||||
|
|
||||||
|
const client = new TerminusClient.WOQLClient(
|
||||||
|
'https://cloud.terminusdb.com/Myseelia/',
|
||||||
|
{
|
||||||
|
user: 'zaldarren@gmail.com',
|
||||||
|
organization: 'Myseelia',
|
||||||
|
db: 'play',
|
||||||
|
token:
|
||||||
|
'dGVybWludXNkYjovLy9kYXRhL2tleXNfYXBpLzJkMDU4N2IwYjgzMzhmODdjMjc0ZDdiNmM1MzgwNjFmYTYyMmZkOTcyZTc3NjI1NzIyYjY3MTllYTE3NmQxYjE=_bd6f9c37d87abcaf0c16b7a68335b31010c8dd04aac0b07bf0f31676af131888666200aac080e72cdc746197334eac4f52d821c90652b5611784878afabe1267535cbd896a00a396'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
try {
|
||||||
|
await client.connect()
|
||||||
|
//console.log(schema);
|
||||||
|
// console.log("result");
|
||||||
|
|
||||||
|
// const result = await client.getDocument({as_list:true,type:"Person",query: { userName: "tester" }})
|
||||||
|
// console.log(result);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('this is it' + err.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
const WOQL = TerminusClient.WOQL
|
||||||
|
|
||||||
|
export async function generateKnowledgeGraph(ids: unknown[]): Promise<object> {
|
||||||
|
const results: unknown[] = []
|
||||||
|
const entities: { id: string; label: string; type: string }[] = []
|
||||||
|
const relations: { source: string; target: string; type: string }[] = []
|
||||||
|
for (const id of ids) {
|
||||||
|
const orgid = 'Organization/' + id['id'].toString()
|
||||||
|
const result = await client.getDocument({ as_list: true, type: 'Organization', id: orgid })
|
||||||
|
for (const document of result) {
|
||||||
|
let orgEntity = entities.find(entity => entity.id === orgid)
|
||||||
|
if (!orgEntity) {
|
||||||
|
entities.push({ 'id': orgid, 'label': document['name'], 'type': 'organization' })
|
||||||
|
orgEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document['assignee'] !== undefined) {
|
||||||
|
const assigneeId = document['assignee']
|
||||||
|
if (assigneeId !== undefined && assigneeId !== '') {
|
||||||
|
let assigneeEntity = entities.find(entity => entity.id === assigneeId)
|
||||||
|
if (!assigneeEntity) {
|
||||||
|
entities.push({ 'id': assigneeId, 'label': document['name'] + ' assignee', 'type': 'attribute' })
|
||||||
|
assigneeEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let assigneeRelation = relations.find(relation => relation.source === orgid && relation.target === assigneeId)
|
||||||
|
if (!assigneeRelation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': assigneeId, 'type': 'assignee' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(document['blockchainecosystem'])) {
|
||||||
|
for (const ecosystem of document['blockchainecosystem']) {
|
||||||
|
const ecosystemId = ecosystem
|
||||||
|
if (ecosystemId !== undefined && ecosystemId !== '') {
|
||||||
|
let ecosystemEntity = entities.find(entity => entity.id === ecosystemId)
|
||||||
|
if (!ecosystemEntity) {
|
||||||
|
entities.push({ 'id': ecosystemId, 'label': ecosystem, 'type': 'attribute' })
|
||||||
|
ecosystemEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let ecosystemRelation = relations.find(relation => relation.source === orgid && relation.target === ecosystemId)
|
||||||
|
if (!ecosystemRelation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': ecosystemId, 'type': 'blockchain ecosystem' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const ecosystemId = document['blockchainecosystem']
|
||||||
|
if (ecosystemId !== undefined && ecosystemId !== '') {
|
||||||
|
let ecosystemEntity = entities.find(entity => entity.id === ecosystemId)
|
||||||
|
if (!ecosystemEntity) {
|
||||||
|
entities.push({ 'id': ecosystemId, 'label': document['blockchainecosystem'], 'type': 'attribute' })
|
||||||
|
ecosystemEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let ecosystemRelation = relations.find(relation => relation.source === orgid && relation.target === ecosystemId)
|
||||||
|
if (!ecosystemRelation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': ecosystemId, 'type': 'blockchain ecosystem' })
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(document['topic'])) {
|
||||||
|
for (const topic of document['topic']) {
|
||||||
|
const topicId = topic
|
||||||
|
if (topicId !== undefined && topicId !== '') {
|
||||||
|
let topicEntity = entities.find(entity => entity.id === topicId)
|
||||||
|
if (!topicEntity) {
|
||||||
|
entities.push({ 'id': topicId, 'label': topic, 'type': 'attribute' })
|
||||||
|
topicEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let topicRelation = relations.find(relation => relation.source === orgid && relation.target === topicId)
|
||||||
|
if (!topicRelation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': topicId, 'type': 'topic' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const topicId = document['topic']
|
||||||
|
if (topicId !== undefined && topicId !== '') {
|
||||||
|
let topicEntity = entities.find(entity => entity.id === topicId)
|
||||||
|
if (!topicEntity) {
|
||||||
|
entities.push({ 'id': topicId, 'label': document['topic'], 'type': 'attribute' })
|
||||||
|
topicEntity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let topicRelation = relations.find(relation => relation.source === orgid && relation.target === topicId)
|
||||||
|
if (!topicRelation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': topicId, 'type': 'topic' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(document['web3'])) {
|
||||||
|
for (const web3 of document['web3']) {
|
||||||
|
const web3Id = web3
|
||||||
|
if (web3Id !== undefined && web3Id !== '') {
|
||||||
|
let web3Entity = entities.find(entity => entity.id === web3Id)
|
||||||
|
if (!web3Entity) {
|
||||||
|
entities.push({ 'id': web3Id, 'label': web3, 'type': 'attribute' })
|
||||||
|
web3Entity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let web3Relation = relations.find(relation => relation.source === orgid && relation.target === web3Id)
|
||||||
|
if (!web3Relation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': web3Id, 'type': 'web3' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const web3Id = document['web3']
|
||||||
|
if (web3Id !== undefined && web3Id !== '') {
|
||||||
|
let web3Entity = entities.find(entity => entity.id === web3Id)
|
||||||
|
if (!web3Entity) {
|
||||||
|
entities.push({ 'id': web3Id, 'label': document['web3'], 'type': 'attribute' })
|
||||||
|
web3Entity = entities[entities.length - 1]
|
||||||
|
}
|
||||||
|
let web3Relation = relations.find(relation => relation.source === orgid && relation.target === web3Id)
|
||||||
|
if (!web3Relation) {
|
||||||
|
relations.push({ 'source': orgid, 'target': web3Id, 'type': 'web3' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
'entities': entities,
|
||||||
|
'relations': relations
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default generateKnowledgeGraph
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue